| 필드 | 설명 |
|---|---|
source |
추적을 시작할 입력값이나 표현식을 지정합니다. |
sanitizer |
해당 룰에서 테인트 전파를 차단하는 것으로 취급할 처리 과정을 지정합니다. 엔진이 함수 구현의 안전성을 자동으로 입증하는 것은 아닙니다. |
sink |
추적 중인 값이 도달했을 때 결과를 보고할 위치를 지정합니다. |
method |
sanitizer와 sink에서 메서드 이름으로 호출을 지정할 때 사용합니다. 필요한 인자 위치나 호출 형태를 구분해야 한다면 그 조건도 룰에 명시해야 합니다. |
다음은 Java 코드에서 특정 입력값의 흐름을 탐지하는 예제입니다.
- 언어는 Java입니다.
getInput()의 반환값이unsafeSink의 첫 번째 인자로 전달되고, 두 번째 인자가"unsafe_option"일 때 탐지합니다.- 이 예제에서는
sanitizerValue가 해당 용도에 맞게 입력값을 처리한다고 가정하고, 그 반환값을 테인트가 제거된 값으로 취급합니다. 실제 룰에서는 이 가정이 해당 함수의 동작과 일치하는지 확인해야 합니다.
yaml
rule:
taint:
source:
pattern: getInput()
sanitizer:
method:
- sanitizerValue
sink:
pattern: unsafeSink($IN, "unsafe_option")
아래 코드에서는 unsafe()의 호출만 이 룰의 탐지 조건을 충족합니다. 나머지 호출에서 결과가 나오지 않는다는 것은 이 룰의 조건을 충족하지 않는다는 뜻이며, 코드 전체가 안전하다는 보장은 아닙니다. 예제에 사용한 함수의 구현은 생략했습니다.
java
public class TaintExample {
public void unsafe() {
String userInput = getInput();
unsafeSink(userInput, "unsafe_option"); // 탐지: 입력값과 옵션이 조건에 일치
}
public void safe_1() {
String userInput = getInput();
unsafeSink(userInput, "safe_option"); // 미탐지: 두 번째 인자가 조건과 다름
}
public void safe_2() {
String userInput = getInput();
userInput = sanitizerValue(userInput);
unsafeSink(userInput,"unsafe_option"); // 미탐지: sanitizer 반환값을 사용
}
public void safe_3() {
String userInput = getInput();
unsafeSink("something", userInput); // 미탐지: 입력값이 첫 번째 인자가 아님
}
}