다단계 Taint 분석 엔진
VEXLIT은 정규식 패턴 매칭에만 의존하지 않습니다. 5단계 분석 파이프라인을 사용하여 사용자 입력(소스)에서 변환을 거쳐 위험한 작업(싱크)까지 실제 데이터 흐름을 추적합니다.
Taint 분석이란?
Taint 분석은 신뢰할 수 없는 데이터(사용자 입력, 환경 변수, 파일 읽기)가 코드를 통해 어떻게 흐르는지 추적합니다. 오염된 데이터가 적절한 정화 없이 위험한 작업에 도달하면 VEXLIT이 이를 악용 가능한 취약점으로 보고합니다.
소스 (Sources)
신뢰할 수 없는 데이터가 애플리케이션에 진입하는 지점.
req.params, req.query, req.body, process.env, System.getenv(), request.GET, os.Args, Console.ReadLine()싱크 (Sinks)
오염된 데이터가 피해를 일으키는 위험한 작업.
db.query(), exec(), eval(), res.send(), innerHTML, Runtime.exec(), os.system(), template.Execute()정화기 (Sanitizers)
오염된 데이터를 무력화하는 작업.
파라미터화된 쿼리, escapeHtml(), parseInt(), DOMPurify.sanitize(), validator.escape()5단계 분석 파이프라인
각 파일은 리터럴 추적부터 함수 간 흐름까지 5단계 분석을 거칩니다.
Phase 1: 상수 전파
할당 전반에 걸쳐 리터럴 값을 추적합니다. 하드코딩된 문자열이나 숫자가 할당된 변수는 안전한 것으로 표시되어 사용자가 제어하지 않는 데이터의 오탐을 제거합니다. 다중 패스 추적이 재할당 체인을 처리합니다.
Phase 2: Taint 맵 구축
5패스 구축: (1) 소스 식별, (2) 필드 접근 추적, (3) 할당을 통한 전파, (4) 정화기 적용, (5) 함수 간 흐름. 각 지점에서 어떤 변수가 오염되었는지의 완전한 맵을 구축합니다.
Phase 3: 도달 가능성 분석
상수 조건을 평가하여 데드 브랜치를 감지합니다. 조건이 항상 true/false로 평가되면 도달 불가능한 브랜치를 분석에서 제외합니다. 산술 연산, 삼항 연산자, switch/case를 지원합니다.
Phase 4: Points-to 분석
컬렉션과 메서드 반환값을 통한 데이터 추적. HashMap 키 민감 추적은 어떤 키가 안전한 값과 오염된 값을 보유하는지 파악합니다. List 요소 추적은 add/get 작업을 통해 데이터를 따라갑니다. 메서드 반환 분석은 함수가 항상 안전한 값을 반환하는지 판단합니다.
Phase 5: AST 데이터 흐름
경로 민감 병합, 필드 민감 taint 전파, 함수 간 반환값 매핑, StringBuilder 체인 분석, 삼항 브랜치 평가. 브랜치 안전성과 타입 캐스트 감지를 위한 AST 스코프 분석을 통합합니다.
작동 원리: SQL 인젝션 탐지
VEXLIT이 SQL 인젝션 취약점을 탐지하는 과정을 단계별로 추적합니다.
app.get('/user', (req, res) => {
const id = req.params.id; // Source: 오염됨
const name = 'admin'; // Literal: 안전
const query = `SELECT * FROM users
WHERE id = '${id}'`; // Propagation: 오염됨
db.query(query); // Sink: SQL 쿼리
});req.params.id가 taint 소스(사용자 입력)로 식별됨
'admin'이 상수 리터럴(안전, 비오염)로 추적됨
템플릿 리터럴 연결이 id에서 query로 taint를 전파
db.query(query)가 파라미터화 없이 오염된 데이터를 받는 SQL 싱크
소스와 싱크 사이에 정화기(파라미터화된 쿼리 등)가 없음
결과: CRITICAL - CWE-89 SQL Injection (악용 가능)
벤치마크 결과
두 가지 업계 표준 벤치마크 스위트에서 검증되었습니다.
OWASP Benchmark v1.2
2,740건 테스트
98.2% 탐지율
TPR
2.8% 오탐율
FPR
95.4
Youden
Juliet Test Suite v1.3
6,864건 테스트
98.2% 탐지율
TPR
1.0% 오탐율
FPR
97.2
Youden
OWASP Benchmark와 Juliet Test Suite 외에도 WebGoat(Spring), NodeGoat(Node.js) 등 실제 오픈소스 프로젝트에서 검증되었습니다.
오탐 방지
여러 계층이 함께 작동하여 노이즈를 제거합니다.
상수 전파가 하드코딩된 값의 변수를 제거
데드 브랜치 감지가 도달 불가능한 코드 경로를 건너뜀
컬렉션 추적이 어떤 맵 키가 안전한 값을 보유하는지 파악
렉시컬 마스킹이 문자열과 주석 안의 매치를 필터링
메서드 반환 분석이 항상 안전한 값을 반환하는 함수를 추적
숫자 파싱(parseInt, Atoi, intval)이 taint 전파를 차단