정적 도달 가능성이 부정을 내릴 때: Python에 대한 Joern 기반 부정적 판정의 실행 검증
요약
본 기사는 SourceLens라는 파이프라인을 사용하여 Python 코드의 부정적 도달 가능성 판정(negative reachability verdict)을 실제 실행으로 검증하는 방법을 제시합니다. Semgrep 발견 사항을 호출 그래프로 매핑하고, PyCG 벤치마크를 통해 Joern과 수동 호출 그래프 간의 불일치를 분석했습니다. 누락된 호출은 값 전달이나 속성 읽기 등 다양한 방식으로 발생하며, 이를 바탕으로 판정 규칙 개선 가능성을 탐구합니다.
핵심 포인트
- SourceLens 파이프라인을 통해 부정적 도달 가능성을 실제 실행 기반으로 검증함.
- Joern과 수동 호출 그래프 간의 불일치는 값 전달이나 속성 읽기 등 비호출 표현식에서 기인함.
- asciinema 벤치마크 분석 결과, 누락된 몇 개의 엣지가 많은 함수를 도달 가능하게 만듦을 확인.
- 부정적 판정을 '알 수 없음'으로 전환하는 규칙이 일부 복구 효과를 보였으나 선택성이 낮음.
부정적 도달 가능성 판정(negative reachability verdict)은 특정 발견 사항을 수동 검토 대상에서 제외합니다. 우리는 이러한 판정들을 실제 실행을 통해 검사합니다. 우리의 파이프라인인 SourceLens는 Semgrep의 발견 사항을 Python 프로그램의 호출 그래프로 매핑하며, 이 그래프의 엣지(edge)는 Joern이 코드 속성 그래프(code property graph)에 연결하는 호출에서 가져온 쿼리입니다. 우리는 PyCG 매크로-벤치마크(PyCG macro-benchmark)에서 두 개의 명령줄 프로그램을 실행했으며, 이 벤치마크에서는 수동 호출 그래프와 Joern의 결과가 불일치했습니다. 우리는 커버리지 하에 작동하며, 해당 함수들 간의 호출을 기록했습니다. 이러한 엣지 상에서, asciinema의 123개 함수는 프로그램의 진입점으로부터 도달할 수 없는 것으로 나타났습니다. 프로젝트 자체 통합 스크립트는 그중 86개를 실행했으며, 우리의 모든 테스트 실행에서는 113개가 실행되었습니다. Sublist3r에서는 24개 중 19개가 실행되었습니다. 최신 Joern 릴리스도 동일한 판정을 내립니다. 누락된 호출들은 클래스나 함수가 전달되는 값(values)을 통해서 이루어지거나, with 블록이나 속성 읽기(property reads)와 같이 호출 표현식이 없는 경우입니다. asciinema의 경우, 네 개의 누락된 엣지가 113개의 실행된 함수 중 50개를 도달 가능하게 만듭니다. 수동 호출 그래프 역시 관찰되지 않은 호출을 포함하는데, asciinema에서는 그중 많은 부분이 속성 읽기나 with 블록이며, 이는 벤치마크가 호출로 간주하지 않을 수 있습니다. 부정적 판정을 알 수 없음(unknown)으로 전환하는 규칙은 dunder 및 private 메서드 이름을 통해 주로 113개 중 62개와 19개 중 15개를 복구합니다. 이 규칙은 실행된 함수들 내에서 부정적 판정이었던 보안 발견 사항 5개 중 0개를 복구했습니다. 그 선택성은 측정할 수 없는데, 왜냐하면 단지 10개와 5개의 부정적 판정만이 실행되지 않았고, 라이브러리 진입점 모델(library entry-point models) 하에서는 모든 부정적 판정을 저하시키기 때문입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 arXiv Codex (cs.SE)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기