GitHub는 2026년 7월 10일, CodeQL 2.26.0 버전에서 AI 프롬프트 주입 탐지 기능이 추가되었다고 발표했습니다. 쿼리를 활성화하는 것도 유용하지만, 회귀 테스트를 소유하는 것이 더 좋습니다.
주요 출처: GitHub Changelog, 2026년 7월 10일.
아래 예시는 제가 테스트한 저장소의 결과가 아니라 구현 템플릿입니다.
구문(Phrase)이 아닌 경로(Path)를 모델링하세요
유용한 fixture는 신뢰할 수 없는 소스, 프롬프트 구성, 그리고 모델 싱크(model sink)를 포함해야 합니다:
security-fixtures/prompt-injection/
├── positive/direct-flow.ts
├── positive/helper-flow.ts
...
ignore previous instructions라는 문자 그대로의 구문을 테스트하지 마십시오. 정적 분석은 데이터 흐름 경로(data-flow path)가 필요합니다. 프로덕션 스택에서 지원되는 SDK 호출을 유지하여 CodeQL이 싱크를 인식할 수 있도록 하세요.
// 의도적으로 취약한 fixture입니다. 이 경로는 절대 배포하지 마십시오.
import { model } from "./supported-client";
...
값을 헬퍼(helper)를 통해 전달하는 두 번째 positive 케이스를 추가하십시오. 그런 다음 공격자 입력이 지침을 선택하거나 변경할 수 없는 negative control을 추가하십시오. sanitize()라는 이름의 함수는 정제화(sanitization)의 증거가 아닙니다.
SARIF 증거 단언하기(Assert Evidence)
SARIF만 업로드한다고 해서 회귀 게이트(regression gate)가 생성되는 것은 아닙니다. 예상 규칙과 fixture 위치를 커밋하십시오:
규칙 ID는 CodeQL 2.26.0 문서나 관찰된 SARIF 결과에서 복사할 때까지 플레이스홀더로 유지하십시오. 기계가 사용하는 식별자(Machine-facing identifiers)는 절대 추측해서는 안 됩니다.
작은 단언문(assertion)을 사용하여 runs[].results[].ruleId와 각 물리적 위치를 이 파일과 비교할 수 있습니다. 필수 경고가 사라지거나 negative fixture가 알림을 보내기 시작하면 실패하도록 하십시오. 저장소의 총 알림 개수를 단언하지 마십시오. 관련 없는 코드 변경은 이를 취약하게 만듭니다.
| 업그레이드 후 결과 | 조치 |
|---|
| 필수 알림 유지 | 일반 검토 계속 |
| ... | |
| CodeQL CLI 또는 액션 버전을 고정하고, 이를 CI에 기록하며, 임시 데이터베이스에서 픽스처를 실행하십시오. 또한 런타임 적대적 테스트도 유지하십시오: 정적 분석은 모델이 어떻게 반응할지 증명할 수 없으며, 사용자 정의 래퍼(wrapper)나 지원되지 않는 SDK는 모델링되지 않을 수 있습니다. | |
목표는 의도적으로 좁습니다: 중요한 신뢰할 수 없는-모델 경로를 변경 로그 체크박스가 아닌 실행 가능한 리포지토리 계약으로 만드십시오.