Opengrep - 오픈소스 정적 코드 분석 치트시트
Opengrep은 Semgrep 엔진의 커뮤니티 관리 포크로, 기능이 상업 라이선스 뒤로 이동한 후 만들어졌습니다. 30+ 언어에서 빠른 패턴 기반 **정적 애플리케이션 보안 테스팅 (SAST)**을 수행하며, 매칭하는 코드처럼 보이는 구문으로 규칙을 작성합니다. AST 전문 지식이 필요 없습니다. 이 포크의 전제는 핵심 스캐닝 기능(파일 간 데이터플로우 같은 기능 포함)이 완전히 오픈소스로 유지되어야 한다는 것입니다.
설치
스캐닝
| 명령 | 설명 |
|---|
opengrep scan . | 기본 규칙으로 현재 디렉토리 스캔 |
opengrep scan --config auto . | 감지된 언어에 대한 규칙 자동 선택 |
opengrep scan --config rules/ . | 로컬 규칙 디렉토리 사용 |
opengrep scan --config p/security-audit . | 규칙 팩 사용 |
opengrep scan --json -o out.json . | JSON 출력 |
opengrep scan --sarif -o out.sarif . | 코드 스캐닝 플랫폼용 SARIF |
규칙 작성
규칙은 YAML이며, pattern은 찾고자 하는 코드처럼 보입니다.
rules:
- id: hardcoded-aws-key
patterns:
- pattern: $KEY = "AKIA..."
message: Possible hardcoded AWS access key
languages: [python, javascript]
severity: ERROR
| 키 | 목적 |
|---|
pattern | 매칭할 코드 형태 ($X = 메타변수) |
patterns | 여러 조건의 AND |
pattern-either | 대안의 OR |
pattern-not | 형태 제외 (거짓 양성 제거) |
pattern-inside | 컨텍스트 내에서만 매칭 |
metavariable-regex | 메타변수 제약 |
severity | INFO / WARNING / ERROR |
패턴 구문 필수사항
| 구문 | 매칭 |
|---|
$X | 모든 단일 표현식 (메타변수) |
... | 모든 시퀀스 (인자, 명령문) |
foo(...) | foo에 대한 모든 호출 |
$OBJ.method(...) | 모든 것에 대한 메서드 호출 |
"..." | 모든 문자열 리터럴 |
# 비리터럴 입력에서 eval() 찾기
- pattern: eval($X)
pattern-not: eval("...")
테인트 / 데이터플로우 규칙
rules:
- id: sqli-taint
mode: taint
pattern-sources:
- pattern: request.args.get(...)
pattern-sinks:
- pattern: cursor.execute($Q)
message: Untrusted input reaches SQL execution
languages: [python]
severity: ERROR
테인트 모드는 소스 (신뢰할 수 없는 입력)에서 싱크 (위험한 작업)로의 데이터를 추적하므로 구문 유사성이 아닌 실제 인젝션 버그를 찾습니다.
CI 통합
# 빌드를 ERROR 심각도 발견 사항에 대해 실패 처리
opengrep scan --config auto --error .
# 이 PR에서 변경된 파일만 스캔
opengrep scan --config auto --baseline-commit origin/main .
| 플래그 | 효과 |
|---|
--error | 발견 사항이 존재할 때 0이 아닌 종료 |
--baseline-commit | Diff 인식 스캔 (새로운 발견 사항만) |
--severity ERROR | 심각도로 필터링 |
--exclude | 경로 건너뛰기 (vendor, tests) |
--sarif | GitHub 코드 스캐닝으로 업로드 |
규칙 테스팅
# 규칙은 예상 발견 사항으로 주석 처리된 테스트 파일과 함께 제공됨
opengrep test rules/
예상 매칭되는 라인 위에 # ruleid: my-rule으로 테스트 파일에 주석을 달고, 매칭되지 않아야 하는 곳에 # ok: my-rule을 달면, opengrep test가 규칙이 작동하는지 검증합니다.
Opengrep vs 관련 도구
| 측면 | Opengrep | Semgrep | CodeQL |
|---|
| 라이선스 | 완전 오픈소스 | 오픈 코어 + 상용 | OSS용 무료, 상용 제한 |
| 규칙 구문 | 코드 유사 패턴 | 동일 계보 | QL 쿼리 언어 |
| 학습 곡선 | 낮음 | 낮음 | 높음 |
| 최적 용도 | 기능 게이팅 없는 오픈 SAST | 관리되는 플랫폼 + 규칙 | 심층 의미 쿼리 |
Semgrep 지식과 쌍을 이루고 (규칙은 대부분 호환) Bandit를 Python 특화 검사로 보완합니다.
리소스