Taint Analysis

필드 설명
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); // 미탐지: 입력값이 첫 번째 인자가 아님
    }
}