Semgrep 란?
Semgrep은 코드소나와 비슷한 코드 정적 분석 툴입니다. 하지만 오픈소스이며 커뮤니티 기반 규칙을 사용, CI나 편집기를 이용해서 온/오프라인 어디서든 빠른 속도로 버그를 찾고 표준 기반 코드를 적용할 수 있습니다. 특히 코드의 보안(Security) 취약점을 검사하는 강력한 기능도 탑재되어 있는 강점이 있는데요. (비슷한 코드 정적 분석 툴인 코드소나 관련 포스틍은 아래 링크 참고하세요.)
이런 몇 가지 차이점에서 Semgrep은 분명 코드소나와는 또다른 관점의 코드 정적 분석 툴이라는 생각이 듭니다.
Semgrep 툴은 r2c라는 회사에서 개발이 되었고 현재도 (거의 매일) 지속적으로 몇 가지 기능 위주로 조금씩 수정이나 개선이 되고 있는데요.
Semgrep가 처음 만들어진 배경 부터 조금 설명해 보겠습니다. 대부분 오픈 소스기반의 툴들이 그렇듯 Semgrep 역시도 아예 처음부터 새로 개발된 정적 분석 툴은 아닙니다, 베이스가 된 원본 소스는 페이스북에서 2009년에 개발이 됐던 오픈소스 기반의 pfff 란 (시각화) 코드 정적 분석 툴의 소스를 가져와서 몇 가지 기능들 위주로 손을 봐서 개발한 툴입니다.
현재도 새 버전이 꾸준히 발행이 되고 있고, 일 주일에 평균 두 번 정도는 발행이 되고 있는 것으로 보입니다. 현재 툴 버전의 완성도를 보자면 (2022년 8월 25일 기준, Ver 0.111.1) 여전히 베타 단계도 아닙니다. 즉 이 말을 다르게 보면 '아직 완성 단계는 아니며 안정화 단계 까지 가려면 여전히 시간이 걸린다'라고 보면 좀 더 정확한 표현 같습니다.
참고로 페이스북의 pfff는 아래 그림처럼 코드를 시각화해서도 볼 수 있는 장점이 있는 코드 정적 분석 툴입니다.
위 그림은 pfff로 리눅스 kernel의 전체 소스 구조를 각 기능별로 시각화해서 보기 편하게 보여주고 있습니다. 개발자 입장에서는 시각화 해서 한 눈에 볼 수 있으니 구현하기 전에 전체 코드를 이해하기에 많은 도움이 될만한 툴 같습니다.
Semgrep 생태계
Semgrep CLI - 오픈소스 CLI(Command Line Interface)가 이 Semgrep 프로젝트의 핵심, Semgrep을 이용하시면 아마도 CLI환경에서 대부분 작업을 하실듯 합니다.
Semgrep Playground - 규칙 작성 및 공유도 가능한 온라인 대화형 툴입니다.
Semgrep 레지스트리 - 보안(Security), 정확성(correctness), 성능(Performance) 버그를 다루고 있는 2,000 개 이상의 커뮤니티 기반 규칙들로 구성되어 있습니다.
Semgrep App - GitHub, GitLab, Jenkins, Slack 등과 같은 소프트웨어들과 통합이 가능. 이들 SCM(Source Code Manager) 을 통해 저장소의 코드를 모니터링 및 통합 배포할 수 있습니다.
Semgrep 연산 방식
1. Login
Scan하기에 앞서 Semgrep App로 로그인을 해야합니다. 로그인을 하려면 사전 작업으로 GitHub 또는 GitLab 계정이 필요합니다. GitHub 계정 생성후에 Semgrep App로 로그인 하게 되면, 위에서 설명한 Semgrep 생태계의 기능들을 사용할수 있는 권한이 부여 됩니다.
2. ADD
GitHub(또는 GitLab, 이하 GitHub)에 저장소를 추가합니다. 참고로 Github에 추가한 저장소에 있는 workflow에는 semgrep.yml이라는 스크립트가 있는데요. 이 스크립트로 향후에 언제 Scan을 할지 스케줄, Scan 명령어에 대한 옵션이나 규칙을 정할 수 있습니다.
3. SCAN
Scan은 말그대로 저장소의 코드가 보안에 문제 없는지, 안정적인지, 성능에는 문제 없는지를 Scan 하는 단계입니다.
참고로 이 규칙들은 1,000개 이상의 프로젝트에서 테스트된 2,000가지 이상의 규칙들을 사용한다고 있습니다.
4. EVALUATE
Scan이 완료된 후의 결과라고 보시면 됩니다. semgrep은 규칙 기반이라 사전에 정의된 규칙들이 있는지를 발견하게 되고 발견된 규칙들을 해당 코드와 매칭해서 결과로 보여줍니다.
5. RESOLVE
APP이나 CLI에서의 결과에서 규칙의 설명을 충분히 파악한 후에 직접 코드를 수정 및 개선을 해야 합니다.
6. TUNE
수정후에 다시 3. SCAN 과정을 반복하면서 코드를 안정화 시킬 수 있습니다.
왜 Semgrep 인가? Semgrep 강점
Free - 무료입니다. 물론 SCM을 편리하게 추가하려면 유로로 지원되는 몇가지 기능도 있긴 하지만 무료로 지원되는 기능만으로도 커뮤니티 기반의 레지시트리 규칙들을 사용하실 수 있습니다.
커뮤니티 기반 오픈 소스 - r2c와 같은 최초 개발한 내부자 뿐만 아니라 외부자들의 커뮤니티에 의해서도 구동이 됩니다.
Fast - ripgrep 만큼은 아니지만 상당히 빠릅니다.
코드는 당신의 머신을 떠나지 않습니다 - 다른 외부의 서버에 접속해서 운용되는 방식이 아닌 자신의 로컬 PC에서 코드를 검사할 수 있습니다.
다양한 많은 프로그래밍 언어 지원 - 20가지 이상의 프로그래밍 언어를 지원 합니다. 이는 최근 프로젝트들이 점점 더 다양한 언어로 구성이 되고 있는 추세인데, Semgrep은 이런 트렌드에 잘 부합합니다.
어디서나 실행 가능 - Semgrep 전체 소스 용량은 100MB 이하로 작고, 이는 런타임 종속성이 작아 가볍고 Scan 속도가 빠릅니다.
오프라인 기반 실행 가능 - 인터넷 접속을 해야만 하거나 특정 조직의 인트라넷망으로만 실행이 가능한 기존 방식이 아닌, 오프라인 기반에서도 실행이 가능하기에, 비행 모드나 여행중에서 실행이 가능합니다. 이는 최근 추세인 원격 근무에서도 강력한 장점이 있습니다.
Semgrep (개인적인) 목표
최근 부상하고 있는 Security를 위한 정적 분석 관점에 있습니다. 이제 목표는 단순히 버그를 잘 발견하는것이 아니라, 저장소로 무단 침입하는 취약점을 방어하는, 보안 기본값 적용하는데 중점을 둬야 합니다.
고비용에 느리고 무거운 기존의 정적 분석 툴들이 상대적으로 가치가 있는지는 개인적으로 의문인데요. 물론 이런 정적 분석 툴 역시도 충분히 모범 사례들을 적용할 수 있기에 작동면에서는 문제는 없을듯 합니다. 하지만 최근의 추세는 더 유연하게 수정이 가능하고, 개방성이 높은 커뮤니티 기반으로 상호 작용하며, 더 작은 용량의 빠른 Semgrep의 효율성이 더 가치가 있어 보입니다.
'Integration & Python' 카테고리의 다른 글
파이썬, 폴더내 특정 확장자 제외 전체 파일 삭제 방법 (0) | 2023.01.27 |
---|---|
Semgrep와 보안 이슈 (0) | 2022.09.05 |
Visual Studio Code WSL 설치 연동 & 윈도우 탐색기 WSL 경로 찾기 (0) | 2022.08.04 |
Semgrep CLI 설치 및 실행 방법 (0) | 2022.08.04 |
오픈 정적 분석 툴 semgrep 소개 (0) | 2022.08.03 |
댓글