콘텐츠로 이동

Opengrep - 오픈소스 정적 코드 분석 치트시트

Opengrep - 오픈소스 정적 코드 분석 치트시트

Opengrep은 Semgrep 엔진의 커뮤니티 관리 포크로, 기능이 상업 라이선스 뒤로 이동한 후 만들어졌습니다. 30+ 언어에서 빠른 패턴 기반 **정적 애플리케이션 보안 테스팅 (SAST)**을 수행하며, 매칭하는 코드처럼 보이는 구문으로 규칙을 작성합니다. AST 전문 지식이 필요 없습니다. 이 포크의 전제는 핵심 스캐닝 기능(파일 간 데이터플로우 같은 기능 포함)이 완전히 오픈소스로 유지되어야 한다는 것입니다.

설치

방법명령
설치 스크립트`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
바이너리GitHub Releases에서 다운로드
확인opengrep --version

스캐닝

명령설명
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메타변수 제약
severityINFO / 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-commitDiff 인식 스캔 (새로운 발견 사항만)
--severity ERROR심각도로 필터링
--exclude경로 건너뛰기 (vendor, tests)
--sarifGitHub 코드 스캐닝으로 업로드

규칙 테스팅

# 규칙은 예상 발견 사항으로 주석 처리된 테스트 파일과 함께 제공됨
opengrep test rules/

예상 매칭되는 라인 위에 # ruleid: my-rule으로 테스트 파일에 주석을 달고, 매칭되지 않아야 하는 곳에 # ok: my-rule을 달면, opengrep test가 규칙이 작동하는지 검증합니다.

Opengrep vs 관련 도구

측면OpengrepSemgrepCodeQL
라이선스완전 오픈소스오픈 코어 + 상용OSS용 무료, 상용 제한
규칙 구문코드 유사 패턴동일 계보QL 쿼리 언어
학습 곡선낮음낮음높음
최적 용도기능 게이팅 없는 오픈 SAST관리되는 플랫폼 + 규칙심층 의미 쿼리

Semgrep 지식과 쌍을 이루고 (규칙은 대부분 호환) Bandit를 Python 특화 검사로 보완합니다.

리소스