단위 7 / 11

안전한 코드 검토 및 정적 분석: 인공 지능으로 취약점 찾기

이득:

  • 인공 지능을 두 번째 눈으로 사용하고 컨텍스트를 제공하여 코드의 OWASP 클래스 취약점(삽입, 하드 비밀, 액세스 제어)을 표시하는 기능
  • 맥락에 따라 인공 지능이 생성한 오탐지를 제거하고 각 결과를 검증하지 않고 실제 취약점으로 처리하는 것을 방지하는 기능
  • 인공 지능이 제안한 수정 사항으로 인해 새로운 취약점/버그가 발생할 수 있음을 인식하고 검토 및 테스트 게이트를 통해 각 패치를 통과할 수 있는 능력

소프트웨어 내의 취약점은 처음부터 제품에 내장되어 수백만 명의 사용자에게 배포되기 때문에 가장 비용이 많이 드는 취약점 중 하나입니다. 보안 코드 검토는 소스 코드를 한 줄씩 읽고 SQL 주입, 인증 취약점, 하드 코딩된 비밀번호, 잘못된 인증 등의 취약점을 프로덕션에 들어가기 전에 파악하는 프로세스입니다. 손으로 하면 느리고 피곤하다. 대규모 코드 기반에서는 취약점을 놓치기 쉽습니다.

AI는 두 가지 이유로 코드 검토에 강력합니다. 코드도 언어이고 AI는 패턴 인식에 능숙합니다. AI는 코드 조각에서 위험한 패턴(사용자 입력을 쿼리에 직접 입력, 암호화되지 않은 데이터 저장, 입력 유효성 검사 누락)에 신속하게 플래그를 지정하고 각 패턴이 위험한 이유를 설명하고 수정 사항을 제안할 수 있습니다. 그러나 AI는 코드의 전체 작동 컨텍스트를 볼 수 없으며(입력이 다른 레이어에서 지워질 수 있음), 존재하지 않는 취약점을 고안하거나(오탐) 실제 취약점을 놓칠 수도 있고(오탐), 가장 중요한 것은 AI가 제안하는 "수정"이 새로운 취약점이나 버그를 유발할 수 있다는 것입니다. AI는 코드 검토에서 두 번째 눈이자 포인터입니다. 개발자와 보안 전문가는 발견한 내용이 실제 취약점인지, 수정 사항이 정확하고 안전한지 여부를 결정합니다.

코드 검토 단계

  1. 범위와 맥락을 제공하십시오. 이 코드는 어떤 언어, 어떤 프레임워크, 어디에서 입력을 받고, 어디에서 출력을 제공하며, 어떤 계층에서 작동합니까? 맥락 없는 코드 검토는 오탐지를 낳습니다.
  2. 위험한 패턴을 검색하세요. 주입, 인증, 민감한 데이터 공개, 액세스 제어 등 알려진 AI 취약성 클래스(예: OWASP 상위 10개)를 검색합니다.
  3. 각 결과가 타당하도록 하십시오. 각 플래그에 대해: 어떤 라인, 어떤 취약점 클래스, 어떻게 악용될 수 있는지, 증거는 무엇입니까? 정당하지 않은 발견은 심각하게 받아들여지지 않습니다.
  4. 거짓 긍정을 제거합니다. 입력이 실제로 지워지고 있는지, 해당 경로에 실제로 액세스할 수 있는지 확인하세요. 컨텍스트를 확인하세요.
  5. 수정 사항을 확인하세요. AI가 권장하는 패치가 실제로 취약점을 해결하는지, 새로운 취약점/버그가 발생하지 않는지, 테스트를 통과했는지 확인하세요.
  6. 인간의 승인. 개발자 + 보안 전문가가 발견 사항 및 수정 사항을 검토합니다. 이것이 코드 저장소에 들어가는 방법입니다.

용어: SAST(정적 애플리케이션 보안 테스트 - 소스 코드를 실행하지 않고 분석하는 정적 보안 테스트). DAST(동적 — 실행 중인 애플리케이션을 외부에서 테스트하는 동적 테스트). OWASP Top 10은 가장 일반적인 웹 애플리케이션 취약점의 표준 목록입니다. 주입은 사용자 입력을 명령/쿼리(예: SQL 주입)로 해석하여 발생하는 취약점입니다. 매개변수화된 쿼리는 코드에서 입력을 분리하여 삽입을 방지하는 올바른 방법입니다.

일반적인 취약점 클래스 표

취약점 등급

증상(코드 내)

올바른 해결책

AI의 함정

SQL 주입

입력을 쿼리에 결합

매개변수화된 쿼리

살균을 무시할 수 있음

하드코딩된 비밀

비밀번호/코드 입력

비밀금고(vault), env

거짓양성(샘플/테스트)

약한 인증

누락/잘못된 제어

강력한 중앙 집중식 제어

맥락을 놓치다

잘못된 액세스 제어

승인 확인 없음

서버 측 인증

복잡한 흐름을 이해하지 못함

민감한 데이터 공개

비밀번호 없는 저장/로깅

암호화, 마스킹

임계성을 알 수 없음

안전하지 않은 직렬화

신뢰할 수 없는 데이터 역직렬화

보안 구문 분석

희귀한 패턴을 놓치다

세 개의 미니 케이스

사례 1 — 실제 주사 잡기. 개발자는 AI로 데이터 접근 기능을 검사하게 된다. AI는 사용자의 userId 값이 SQL 텍스트에 직접 연결되는 줄을 표시하고 "이것은 고전적인 SQL 주입입니다. 매개변수화된 쿼리로 전환하세요"라고 말합니다. 샘플 수정을 제공합니다. 개발자는 입력이 다른 곳에서 삭제되지 않았는지 확인하고, 실제 취약점인지 확인한 후 제안된 매개변수화된 쿼리를 구현하고 테스트를 작성합니다. AI는 취약점을 강조했습니다. 검증 및 수정 테스트는 개발자로부터 이루어졌습니다.

사례 2 — 거짓 긍정 고정 비밀. AI는 파일에서 비밀번호 = "test1234" 줄을 보고 "중요: 하드코드된 비밀번호"라고 말합니다. 개발자는 컨텍스트를 확인합니다. 이는 단위 테스트 파일, 더미 테스트 데이터이며 프로덕션으로 출시되지 않고 실제 시스템으로 이식되지 않습니다. 결과는 위양성입니다. 개발자는 이를 문서화하지만 실제 비밀이 아니기 때문에 조치를 취하지 않습니다. 교훈: AI의 "엄격한 비밀" 표시는 상황에 따라 제거되어야 합니다. 모든 문자열이 비밀은 아닙니다.

사례 3 - 새로운 취약점 수정. AI는 XSS(교차 사이트 스크립팅) 취약점에 대한 수정 사항을 제안합니다. 그러나 그가 제안한 코드는 잘못된 위치의 입력을 지우고 다른 영역의 출력 인코딩을 건너뜁니다. 결과적으로 격차가 완전히 닫히지 않습니다. 보안 전문가는 수정 사항을 검토하고 누락된 코딩을 발견한 후 올바른 레이어에서 수정합니다. 교훈: AI가 권장하는 패치는 자동으로 보안되지 않습니다. 모든 수정 사항이 검토되고 테스트됩니다.

약한 프롬프트 / 강한 프롬프트

약한 프롬프트:

이 코드에 허점이 있나요? 수정하세요. [코드]

이 프롬프트는 컨텍스트(언어, 프레임워크, 입력 소스)를 제공하지 않으며 정당성을 요구하지 않으며 거짓 긍정에 의문을 제기하지 않으며 AI가 생성한 수정 사항을 맹목적으로 수용할 수 있습니다. AI는 실제 취약성과 존재하지 않는 취약성의 징후를 혼합합니다.

강력한 프롬프트:

귀하의 역할: 보안 코드 검토에서 개발자의 두 번째 눈인 조수. 의사 결정; 직접 적용된 수정 사항을 고려하십시오. 코드: [언어/프레임워크 지정].Context: 이 함수 [입력 소스: 예: [외부 HTTP 요청]을 수신하고 [출력 대상]에 씁니다. 귀하의 작업: (1) OWASP 클래스로 가능한 취약점을 표시하고, 줄 번호 + 위험한 이유 + 악용 방법 + 각각에 대한 증거 제공, (2) 각 결과에 대해 최소 1개의 거짓 긍정 시나리오 작성(예: 입력이 다른 레이어에서 삭제된 경우), (3) "[검토 + 테스트 작성]" 기호를 사용하여 수정 사항을 제안합니다. 또한 수정으로 인해 새로운 취약점/버그가 발생하는지 평가하십시오. 가짜 취약점을 추가합니다.[코드]

강력한 프롬프트는 상황을 제공하고, OWASP 클래스 및 증거를 요청하고, 거짓 긍정 및 교정 위험에 대해 질문하고, 인적 검토를 강제합니다.

복사 가능한 프롬프트 템플릿

취약점 스캔 템플릿 OWASP 상위 10에 대한 [언어/프레임워크] 코드를 검사합니다. 가능한 각 결과에 대해: 줄 번호, 취약점 클래스, 위험한 이유, 샘플 악용, 증거 강도(확실함/가능성 있음/약함). 컨텍스트: 입력 [소스], 출력 [대상]. 조작된 결과 추가 확실하지 않은 경우 "[확인해야 함]"을 입력하세요. 코드: [붙여넣기]

거짓 긍정 제거 패턴 다음 코드 검색에 대해 실제 취약점이 없는 시나리오를 나열하십시오. 다른 계층에서 입력을 지울 수 있습니까? 이 경로에 액세스할 수 있습니까? 이 값은 테스트/샘플입니까? 프레임워크가 자동으로 보호됩니까? 각각 확인하는 방법을 적어주세요. 발견 항목: [붙여넣기]

수정 평가 템플릿다음 취약점에 대한 수정을 권장합니다. 그런 다음 자신의 수정 사항을 평가하십시오. (1) 취약점이 실제로 해결되는지, (2) 새로운 취약점/버그가 발생하는지, (3) 어떤 테스트를 작성해야 하는지(긍정적 및 부정적 사례), (4) 성능/기능에 영향을 미칩니다. 수정 사항을 검토하고 테스트하겠습니다. 취약점 + 코드: [붙여넣기]

취약점 클래스에 대한 보안 패턴 교육 템플릿[예: SQL 주입]은 이 언어/프레임워크의 안전한 타이핑 패턴과 일반적인 오류 패턴을 비교하여 보여줍니다. 일반 규칙 + 코드 예제 제공; 하지만 내 코드에 구현하기 전에 컨텍스트를 물어보시기 바랍니다. 언어/프레임워크: [쓰기]

일반적인 실수

  • 맥락 없이 검토하세요. 언어, 프레임워크, 입력/출력 컨텍스트가 없으면 AI는 실제 결과와 가짜 결과를 모두 혼동합니다. 반드시 맥락을 설명하세요.
  • 모든 징후를 실제 약점으로 착각합니다. AI는 거짓 긍정(테스트 데이터, 다른 레이어에서 정리된 입력)을 생성합니다. 맥락에 따라 각 결과를 선별합니다.
  • AI의 수정 사항을 맹목적으로 적용합니다. 권장 패치에는 새로운 취약점/버그가 발생할 수 있습니다. 테스트를 검토하고 작성합니다.
  • 거짓 부정을 신뢰합니다. AI가 "취약점 없음"이라고 말하더라도 중요한 경로를 직접 조사하십시오. 정적 스캐닝은 모든 취약점을 탐지하지는 않습니다.
  • 외부 도구에 코드/비밀번호를 제공합니다. 개인 코드와 실제 비밀(키, 비밀번호)은 지적 재산이자 취약성입니다. 기업의 격리된 도구를 익명화하거나 사용합니다.
팁: AI 리뷰 코드가 있을 때 가장 효율적인 필터는 각 결과에 대해 "증거의 강도"(확실함/가능성 있음/약함)를 묻는 것입니다. "약함"으로 표시된 대부분의 결과는 위양성입니다. 당신은 당신의 에너지를 "확실한" 것들에 할당합니다.
주의: AI가 제안한 보안 수정 사항은 테스트를 거치지 않고 창고에 들어가서는 안 됩니다. 잘못된 "수정"으로 인해 취약점이 공개되고 프로덕션에서 기능 오류가 발생할 수 있습니다. 모든 패치는 검토 및 테스트 게이트를 거칩니다.

요약하면

안전한 코드 검토는 프로덕션에 들어가기 전에 취약점을 발견하는 가장 저렴한 방법입니다. 코드는 언어이기 때문에 AI는 여기서 강력한 두 번째 눈이 됩니다. 위험한 패턴을 표시하고, 위험을 설명하고, 수정 사항을 제안합니다. 하지만 AI는 전체 운영 상황을 보지 못하고, 거짓 긍정과 거짓 부정을 낳고, AI가 권장하는 패치로 인해 새로운 취약점이 나타날 수도 있습니다. 따라서 검토는 6단계(컨텍스트, 선별, 타당성, 오탐지 제거, 수정 확인, 사람 승인)로 이루어지며 결정은 개발자와 보안 전문가에게 있습니다. 세 가지 원칙: 맥락 없이는 어떤 결과도 해석되지 않으며, 모든 징후는 맥락에 따라 제거되며, 수정 사항은 테스트되지 않은 상태로 저장되지 않습니다. 그리고 코드/비밀은 익명화 없이는 외부 도구에 절대 제공되지 않습니다.

응용과제

샘플 코드 조각을 가져옵니다(자신의 코드에서 민감한 부분을 제거하거나 취약점이 있는 샘플 코드 중 하나). AI가 "취약점 검색" 템플릿을 사용하여 이를 검사하도록 하세요. 각 결과에 대해 "거짓 긍정 제거" 템플릿을 적용하고 실제 결과를 제거합니다. "교정 평가" 템플릿을 사용하여 가장 심각한 결과를 수정하고 직접 검토한 후 긍정적인 테스트 사례 하나와 부정적인 테스트 사례 하나를 작성하세요. 얼마나 많은 결과가 오탐지인지 확인하세요.

체크리스트

  • [ ] 코드를 검토하기 전에 언어, 프레임워크 및 입력/출력 컨텍스트를 제공했습니다.
  • [ ] 각 결과에 대한 줄 번호, 취약점 클래스, 공격 경로 및 증거를 요청했습니다.
  • [ ] 각 결과에 대해 맥락을 고려하여 오탐지를 선별했습니다.
  • [ ] AI의 보정을 맹목적으로 적용한 것은 아닙니다. 검토하고 테스트를 작성했습니다.
  • [ ] "취약성 없음" 출력에도 불구하고 중요한 경로를 직접 조사했습니다.
  • [ ] 코드/비밀을 익명화했거나 회사에서 격리된 도구를 사용했습니다.
  • [ ] 개발자 + 보안 승인을 통해 검색 및 수정을 통과했습니다.