AI Code Security — SAST가 놓친 AI 생성 코드를 잡아내는 네 가지 에이전트. GitLab Duo Agent Platform 기반.
AI 코드 보안 — AI 생성 코드에서 SAST가 놓치는 것을 포착합니다 GitLab Duo Agent Platform 기반
AI 생성 코드의 40-62%에 보안 취약점이 포함되어 있습니다. 기존 SAST는 CVE를 탐지합니다. 우리는 SAST가 놓치는 것 — 프롬프트 인젝션, LLM 출력 실행, 안전하지 않은 ML 역직렬화를 탐지합니다.
AI는 코드 생성을 가속화하지만 새로운 보안 병목 현상을 만듭니다:
| 문제 | 영향 |
|---|---|
| 보안 리뷰가 MR을 몇 시간 또는 며칠 동안 차단합니다 | 팀원당 주당 7시간 손실 |
| AI가 규정 준수 관리를 더 어렵게 만듭니다 | 팀의 70% 가 보고 |
| 배포 후 발견된 규정 준수 문제 | 조직의 76% |
| 기존 SAST 도구는 AI 특화 위험을 놓칩니다 | 프롬프트 인젝션, LLM 출력-실행, 안전하지 않은 ML 역직렬화 |
| AI 생성 코드의 40-62%에 취약점이 있습니다 | 기존 도구는 AI 특화 위협 패턴을 탐지하지 않음 |
출처: GitLab 2025 Global DevSecOps Report
AgentFlow Auditor — AI 생성 코드에서 기존 SAST가 놓치는 보안 위험을 탐지하는 4개의 AI 에이전트. LLM 프롬프트 인젝션, 출력-실행, 안전하지 않은 역직렬화, SQL 인젝션, SSRF, 경로 탐색을 포함한 41개의 탐지 규칙. 스캔 가능한 보고서를 게시하고, 수정 패치를 생성하며, 위험 변화를 추적합니다. 한 번의 @멘션으로 모든 것을 트리거합니다.
---``` Developer opens MR │ ▼ @duo-agentflow-auditor review this MR │ ▼ ┌───────────────────────────────────────────────────────┐ │ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │ Scanner │──────▶│ Reporter │ │ │ │ Agent │ │ Agent │ │ │ │ │ │ │ │ │ │ Read diffs │ │ Grade risk │ │ │ │ Match 34 │ │ Risk heatmap │ │ │ │ rules │ │ Post MR comment │ │ │ │ Score risk │ │ Create issue │ │ │ └─────────────┘ └────────┬─────────┘ │ │ │ │ │ ┌───────┴────────┐ │ │ │ SAFE? │ │ │ │ ├─ Yes ──────────────┐ │ │ │ └─ No ───┐ │ │ │ │ └───────────┘ │ │ │ │ │ │ │ │ │ ┌─────────────┐ ┌────────▼───────┘┐ │ │ │ │ Metrics │◀──────│ Fixer │ │ │ │ │ Agent │ │ Agent │ │ │ │ │ │◀──────────────────────────────┘ │ │ │ Baseline │ │ Confidence-scored│ │ │ │ Cross-MR │ │ patches │ │ │ │ Green │ │ Fix branch + MR │ │ │ │ Posture │ │ │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ GitLab Duo Agent Platform (ambient) │ │ │ │ ┌───────────────────────────────────────────┐ │ │ │ External SAST Agent (CI/CD container) │ │ │ │ bandit + semgrep + custom rules merge │ │ │ └───────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────┘
### 에이전트 명단
| 에이전트 | 역할 | 도구 | 주요 기능 |
|:------|:-----|:------|:---------------|
| **스캐너** | MR 변경사항 분석 | 10개 도구 | 41개 규칙 (26개 정규식 + 15개 Semgrep), AI 특화 위협 탐지, 취약점 통합 |
| **리포터** | 감사 보고서 게시 | 7개 도구 | 10초 내 스캔 가능 (등급 + 히트맵 + 상위 5개), 취약점 링크, DANGER 시 자동 이슈 생성 |
| **픽서** | 코드 수정안 생성 | 8개 도구 | 신뢰도 기반 패치 (HIGH/MEDIUM/LOW), 자동 수정 MR 생성 |
| **메트릭스** | 위험 기준선 추적 | 6개 도구 | MR 간 학습, 팀 보안 상태, 기준선 변이, 에너지/탄소 추적 |
| **SAST 스캐너** | 외부 SAST | CI/CD | bandit + semgrep 실행, Python 스크립트를 통해 사용자 정의 규칙과 병합 |
---
## 기능
<table>
<tr>
<td width="50%">
### 보안 스캐닝
- **41개 탐지 규칙** — 26개 정규식 + 15개 Semgrep 사용자 정의 규칙
- **8개 위험 범주** — 파괴적 명령어부터 프롬프트 인젝션까지
- **AI 특화 탐지** — LLM 프롬프트 인젝션, 출력-실행 변환, 안전하지 않은 역직렬화
- **위험 점수** — 발견 항목당 0-100 (심각도 x 컨텍스트 x 범주)
- **등급 시스템** — SAFE / WARNING / DANGER
</td>
<td width="50%">
### 자동화
- **원트리거 활성화** — `@멘션` 또는 리뷰어 지정
- **조건부 라우팅** — SAFE 스캔은 픽서를 건너뛰어 토큰 절약
- **구조화된 MR 댓글** — 위험 표, 수정 제안, 접을 수 있는 세부 정보
- **자동 수정 생성** — 새 브랜치에 코드 패치
- **이슈 생성** — DANGER 등급 시 자동 생성
</td>
</tr>
<tr>
<td width="50%">
### 기준선 추적
- **위험 변이 탐지** — 시간 경과에 따른 스캔 비교
- **추세 분석** — 개선 중 / 악화 중 / 안정적
- **수정 채택률** — 제안이 적용된 비율 추적
- **이력 로그** — 스캔당 JSONL 추가
</td>
<td width="50%">
### 그린 메트릭스
- **토큰 추적** — 스캔당 사용량
- **에너지 추정** — 스캔당 kWh
- **탄소 발자국** — 실제 비유와 함께 kg CO2
- **최적화 제안** — 스캔 범위 축소, 기준선 캐싱
</td>
</tr>
</table>
---
## 탐지 범주
### Semgrep 사용자 정의 규칙
6개 범주에 걸친 15개의 프로덕션 등급 Semgrep 규칙:
| 규칙 | 범주 | 심각도 | 탐지 |
|:-----|:---------|:---------|:----------|
| `llm-prompt-injection` | AI 보안 | WARNING | LLM API 호출로 흘러들어가는 사용자 입력 |
| `llm-output-code-exec` | AI 보안 | ERROR | LLM 출력이 exec/eval에 전달됨 |
| `unsafe-deserialization-ml` | AI 보안 | WARNING | pickle.load, torch.load를 신뢰할 수 없는 모델에 사용 |
| `sql-injection` | 웹 보안 | ERROR | 문자열 형식 SQL 쿼리 (f-string, .format, concat) |
| `path-traversal` | 웹 보안 | ERROR | 파일 경로 작업의 사용자 입력 (../ 트래버설) |
| `ssrf-request-forgery` | 웹 보안 | ERROR | HTTP 요청에서 사용자 제어 URL |
| `open-redirect` | 웹 보안 | WARNING | 리다이렉트 함수의 사용자 입력 |
| `missing-input-validation` | 웹 보안 | WARNING | 스키마 검증 없이 사용된 요청 데이터 |
| `dangerous-eval-exec` | Python | WARNING | 동적 콘텐츠와 함께 eval/exec 사용 |
| `subprocess-shell-true` | Python | WARNING | shell=True를 사용한 subprocess |
| `dangerous-os-system` | Python | WARNING | os.system/popen (비권장) |
| `insecure-random-python` | 암호화 | WARNING | 보안 토큰에 random 모듈 사용 |
| `insecure-random-javascript` | 암호화 | WARNING | 보안 토큰에 Math.random() 사용 |
| `hardcoded-credentials` | 비밀 | WARNING | 하드코딩된 비밀번호, API 키, 토큰 |
| `insecure-http` | 네트워크 | INFO | HTTP URL (HTTPS로 자동 수정 포함) |
### 정규식 탐지 범주
| 범주 | 심각도 | 예시 패턴 |
|:---------|:---------|:-----------------|
| 파괴적 명령어 | 🚨 위험 | `rm -rf /`, `mkfs`, `dd to disk` |
| 자격 증명 유출 | 🚨 위험 | 비밀을 외부 URL로 POST하는 `curl` |
| 프롬프트 인젝션 (심각) | 🚨 위험 | "이전 지침 무시", 역할 재정의 |
| 난독화된 실행 | 🚨 위험 | `base64 -d \| bash`, 쉘로 원격 파이프 |
| 쉘 실행 | ⚠️ 경고 | `shell=True`, `eval()`, `exec()`, `os.system()` |
| 네트워크 호출 | ⚠️ 경고 | 외부 URL로 `curl`/`wget`/`fetch` |
| 안전하지 않은 전송 | ⚠️ 경고 | HTTPS를 사용해야 할 때 `http://` 사용 |
| 하드코딩된 자격 증명 | ⚠️ 경고 | 소스 코드 내 비밀번호, API 키, 토큰 |
### 위험 점수 공식```
score = severity_weight + category_weight + executable_context + actionable + risk_modifier
= clamp(0, 100)
severity_weight: danger=50, warning=25
category_weight: destructive-command=15, credential-exfil=15, prompt-injection=10, ...
executable_context: +20 if file is .sh/.py/.js/.ts
actionable: +15 if executable AND not in trusted domain allowlist
risk_modifier: per-rule adjustment (0-15)