본문 바로가기
Integration & Python

오픈 정적 분석 툴 semgrep 소개

by 누워서 코딩 2022. 8. 3.

semgrep 란?

오픈 정적 분석 툴인 semgrep는 최신 언어들을 위한 오픈 소스 정적 분석 도구입니다. 사용 가능한 언어는 기존의 C, C++을 포함하며 최근 많이 사용되는 Python과 같은 최신 언어들(총 21개) 도 다수 포함하고 있습니다.

 

유료화된 정적 분석 도구가 아닌 오픈 소스 방식의 정적 분석 도구로 1,500개 이상의 기존 규칙을 포함하며, 이 외 만들기 쉬운 사용자 지정 규칙을 통해 중요한 버그를 찾을 수 있습니다.

 

Semgrep 장점

  • 오픈 소스 방식
  • 20개 이상, 현재 21개의 언어에서 작동

출처: semgrep.dev

 

Experimental: 현재는 많은 알려진 버그를 실험적으로 지원, 우선순위를 낮게 보고 사용자가 추가 개선이 필요해 보임

Beta: 알려진 버그가 있는 지원 언어, 버그가 보고 되면 Semgrep팀에서 신속히 대응중

GA: 알려진 버그가 거의 없는 프로덕션 수준 지원, 사용자의 버그 보고나 피드백을 찾는 단계로 일반적으로 24시간 이내 지원 응답 중

 

완성도는 GA < Beta < Experimental 3가지 수준이 있습니다. 이 성숙도의 수준은 다음 요소의 임계값과 결합하여 결정됩니다.

 

 

1. 구문 분석 속도

Semgrep 가 주어진 언어의 코드를 구문 분석할 수 있는 정도

2. 기능 지원

주어진 언어에 대해 구현되는 Semgrep의 기능

3. 규칙 집합 수

클라우드 앱의 Semgrep 규칙 그룹 수

 

Bash (Experimental)
C (Experimental)
C++ (Experimental)
C#
Dockerfile (Experimental)
Generic (Experimental)
Go
HTML (Experimental)
Java
JavaScript
JSON (Beta)
Lua (Experimental)
OCaml (Experimental)
Python
Ruby
Rust (Experimental)
Scala (Beta)
Solidity (Experimental)
Terraform (Beta)
TypeScript
YAML (Experimental)

 

  • 코드처럼 보이는 규칙으로 작성
    • 타 정적 분석 도구에서 사용하는 복잡한 구조의 DSL 방식이 아님
#CodeSonar의 Pipeline DSL 언어 예제

pipeline {
    agent any
    parameters {
        string (
            defaultValue: 'some-name',
            description: 'The name of the project in CodeSonar',
            name : 'JOB_NAME'
        )
        
 Jenkins Job DSL
Available options

#Jenkins의 DSL 예제
job{
    publishers{
        codeSonar(String hubAddress, String projectName){
            cyclomaticComplexity(int maxComplexity, boolean markAsFailed)
            redAlert(int maxAlerts, boolean markAsFailed)
            yellowAlert(int maxAlerts, boolean markAsFailed)
            newWarningCountIncrease(float percentage, boolean markAsFailed)
            overallWarningCountIncrease(float percentage, boolean markAsFailed)
            rankedWarningCountIncrease(int minRank, float percentage, boolean markAsFailed)
        }
    }
}

 

  • 터미널 / 편집기 또는 CI/CD에서 신속하게 결과를 얻을 수 있음 -> 예로 CI/CD인 Jenkins, Github 앱 상에서 결과를 얻기 가능.
CI(Continuous Integration) : 빌드/테스트 자동화 과정, 개발자를 위한 자동화 프로세스인 지속적인 통합을 의미
CD(Continuous Delivery) : 배포 자동화 과정

 

  • Github 앱 사용 시 Semgrep 결과를 PR주석으로 얻고, 한 번의 클릭으로 Semgrep를 프로젝트에 추가 후 중앙집중식으로 한 곳에서 여러 프로젝트의 규칙과 결과를 관리할 수 있습니다.

 

  • 진행 중인 문제에 플래그를 지정, pull 요청에서 결과 얻기 가능

 

Semgrep는 r2c에서 개발 및 기술 지원을 합니다.

 

댓글