Semgrep은 패턴 기반의 경량 정적 분석 도구다. 코드 구조를 이해하는 패턴 매칭으로 보안 취약점, 버그, 코드 스타일 위반을 빠르게 탐지한다. 자체 규칙 작성이 간편하다.
Semgrep vs 기타 SAST 비교
| 항목 | Semgrep | SonarQube | CodeQL |
|---|
| 규칙 작성 | 간단 (YAML) | 복잡 | QL 언어 필요 |
| 속도 | 빠름 | 보통 | 느림 |
| 자체 규칙 | 매우 쉬움 | 어려움 | 어려움 |
| 언어 지원 | 30+ | 30+ | 20+ |
| 오픈소스 | 코어 오픈소스 | 커뮤니티 에디션 | 오픈소스 |
커스텀 규칙 작성
yaml
# no-console-log.yaml
rules:
- id: no-console-log-in-production
pattern: console.log(...)
message: "프로덕션 코드에 console.log 사용 금지"
severity: WARNING
languages: [javascript, typescript]
metadata:
category: best-practice
- id: sql-injection-risk
patterns:
- pattern: |
$QUERY = "SELECT ... " + $INPUT
- pattern-not: |
$QUERY = $DB.prepare(...)
message: "SQL 인젝션 취약점 가능성"
severity: ERROR
languages: [javascript, python]
metadata:
cwe: CWE-89
CI 통합
bash
# 설치
pip install semgrep
# 커뮤니티 규칙셋으로 스캔
semgrep --config=auto .
# 특정 규칙셋
semgrep --config=p/owasp-top-ten .
semgrep --config=p/typescript .
# SARIF 출력 (GitHub Security에 업로드)
semgrep --config=auto --sarif -o results.sarif .
GitHub Actions
yaml
- uses: returntocorp/semgrep-action@v1
with:
config: >
p/security-audit
p/owasp-top-ten
p/typescript
auditOn: push
generateSarif: "1"
- uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: semgrep.sarif
관련 문서