
C/C++ 소스 코드에서 취약점을 찾기 위한 정적 분석 도구
이것은 David A. Wheeler의 "flawfinder"입니다.
Flawfinder는 C/C++ 소스 코드를 스캔하고 잠재적인 보안 결함을 보고하는 간단한 프로그램입니다. 이는 소프트웨어의 취약점을 검사하는 유용한 도구가 될 수 있으며, 보다 일반적으로 정적 소스 코드 분석 도구에 대한 간단한 소개 역할을 할 수도 있습니다. 설치와 사용이 쉽도록 설계되었습니다. Flawfinder는 Common Weakness Enumeration(CWE)을 지원하며 공식적으로 CWE 호환입니다. SARIF, SonarQube, HTML을 포함한 다양한 출력 형식을 지원합니다.
Flawfinder는 AI 기반 코드 분석 도구와 함께 사용할 수 있습니다. Flawfinder 출력은 코드에서 더 면밀히 주목해야 할 영역을 빠르게 식별하는 데 사용할 수 있으며, AI 시스템이 이를 더 자세히 검토할 수 있습니다.
자세한 내용은 프로젝트 웹사이트를 참조하세요.
Flawfinder는 명령줄 도구로 Unix/Linux/POSIX 시스템(Cygwin, Linux 기반 시스템, MacOS, 다양한 BSD 포함)에서 사용하도록 설계되었습니다. Python이 필요합니다(Python 3로 테스트하며, Python 2.7도 작동해야 하지만 점점 테스트되지 않고 있습니다).
단순히 사용만 하려면 Python의 "pip" 또는 시스템 패키지 관리자(flawfinder는 많은 시스템용 패키지를 제공합니다)를 사용하여 flawfinder를 설치할 수 있습니다. 또한 일반적인 make install 소스 설치 규칙을 따라 쉽게 설치할 수 있습니다. INSTALL.md 파일에 더 자세한 설치 지침이 있습니다. 실행하기 위해 반드시 설치할 필요는 없지만, 그렇게 하는 것이 가장 쉽습니다.
flawfinder를 실행하려면 소스 파일 또는 디렉토리 목록을 제공하면 됩니다. 예를 들어, "src/" 디렉토리와 그 하위의 모든 파일을 재귀적으로 검사하려면:
flawfinder src/
현재 디렉토리와 그 하위의 모든 파일을 재귀적으로 검사하려면:
flawfinder ./
발견 항목(결과)에는 0(매우 낮은 위험)부터 5(높은 위험)까지의 위험 수준이 지정됩니다. 기본적으로 위험 수준 1 이상의 결과가 표시됩니다. 현재 디렉토리와 그 하위에서 위험 수준 4 이상의 결과만 표시하려면 다음과 같이 합니다:
flawfinder --minlevel 4 ./
매뉴얼 페이지(flawfinder.1 또는 flawfinder.pdf)에는 flawfinder 사용 방법(다양한 옵션 포함) 및 관련 정보(CWE 지원 방법 등)가 설명되어 있습니다. 예를 들어, --html 옵션은 HTML 형식으로 출력을 생성합니다. --help 옵션은 간단한 옵션 목록을 제공합니다.
Flawfinder는 소스 코드의 문자 인코딩을 올바르게 해석할 수 있어야 합니다. 대부분의 경우 특히 소스 코드가 UTF-8로 올바르게 인코딩되고 시스템이 UTF-8을 사용하도록 구성된 경우(현재 가장 일반적인 상황) 문제가 되지 않습니다. 그러나 문자 인코딩 문제가 있고 Python3을 실행 중인 경우 flawfinder가 중단될 수 있습니다. 일반적인 증상은 다음과 같은 오류 메시지입니다:
Error: encoding error in FILENAME 'ENCODING' codec can't decode byte ... in position ...: invalid start byte
안타깝게도 Python3는 이 문제를 처리하는 유용한 내장 기능을 제공하지 않습니다. 따라서 외부 라이브러리에 의존하지 않고(이는 피하려고 합니다) 이 문제를 해결하는 것은 간단하지 않습니다.
이 문제가 발생하면 flawfinder 매뉴얼 페이지에서 다양한 해결 방법을 참조하세요. 가장 간단한 방법 중 하나는 소스 코드와 시스템 구성을 UTF-8로 변환하는 것입니다. 시스템 도구 iconv 또는 Python 프로그램 cvt2utf를 사용하여 소스 코드를 UTF-8로 변환할 수 있습니다. cvt2utf는 pip install cvt2utf로 설치할 수 있습니다.
더 기술적으로, flawfinder는 어휘 스캐닝을 사용하여 취약점을 암시하는 토큰(예: 함수 이름)을 찾고, 위험 수준을 추정하며(예: 함수 호출의 텍스트를 통해), 결과를 보고합니다. Flawfinder는 제어 흐름, 데이터 흐름, 데이터 유형, 네임스페이스 및 범위에 대한 대부분의 정보를 사용하거나 액세스하지 않습니다. 따라서 flawfinder는 필연적으로 많은 가양성(false positive)을 생성하고 많은 취약점을 보고하지 못합니다. 반면, flawfinder는 빌드할 수 없거나 링크할 수 없는 프로그램에서도 취약점을 찾을 수 있습니다. 또한 flawfinder는 대부분의 매크로 정의 및 더 정교한 도구가 어려움을 겪는 기타 특이한 사항에 덜 혼동됩니다.
GitHub을 사용하는 사람들을 위한 GitHub 액션이 있습니다.
action.yml을 참조하세요.
.github/workflows 아래에 다음 내용으로 .yml 파일을 만드세요:
- name: flawfinder_scan
uses: david-a-wheeler/[email protected]
with:
arguments: '--sarif ./'
output: 'flawfinder_results.sarif'
인수에 많은 다른 추가 사항을 추가할 수 있습니다. 예를 들어, --error-level=4는 flawfinder가 수준 4 이상의 취약점을 찾으면 오류를 반환하도록 합니다. @ 기호 뒤의 버전 번호를 주목하세요. 다른 버전을 선택할 수 있습니다.
액션 이름과 버전 문자열은 Marketplace에서 "Use latest/xxx version" 버튼을 클릭하여 찾을 수 있습니다.
Flawfinder는 SonarQube의 cxx 플러그인과 통합됩니다. 다음 옵션을 사용하여 Flawfinder를 한 번 실행하여 SonarQube의 "Administration > CXX External Analyers > Other Rule Definitions"에서 Flawfinder 규칙을 추가하세요.
flawfinder --listrules --sonar [...]
그런 다음 CI/CD에서 다음과 같이 Flawfinder를 실행하여 SonarQube가 이해할 수 있는 출력을 생성하세요.
flawfinder -CDQ --sonar [...]
출력을 파일로 리디렉션한 다음 sonar.cxx.other.reportPaths 옵션을 통해 SonarQube에 로드할 수 있습니다.
기여를 환영합니다! 기여에 대한 자세한 내용은 CONTRIBUTING.md 파일을 참조하세요.
Flawfinder는 GNU GPL 라이선스 버전 2 이상(GPL-2.0+)으로 배포됩니다. 라이선스 정보는 COPYING 파일을 참조하세요.