BoundsSanitizer

BoundsSanitizer(BoundSan)는 바이너리에 계측을 추가하여 배열 액세스에 관한 범위 검사를 삽입합니다. 이러한 검사는 비교 검사가 가능하도록 배열 크기가 런타임 시에 알려지며 컴파일러가 컴파일 시간에 액세스가 안전할 것임을 증명할 수 없는 경우에 추가됩니다. Android 10은 블루투스 및 코덱에서 BoundSan을 배포합니다. BoundSan은 컴파일러에 의해 제공되며 플랫폼 곳곳의 다양한 구성요소에서 기본으로 사용 설정됩니다.

구현

BoundSan은 UBSan의 바운드 새니타이저를 사용합니다. 이 완화는 모듈별 수준에서 사용 설정됩니다. 이는 Android의 중요 구성요소를 안전하게 유지할 수 있게 도와주며 사용 중지하면 안 됩니다.

추가 구성요소에는 BoundSan을 사용 설정하는 것이 좋습니다. 이상적인 후보는 권한이 있는 네이티브 코드나 신뢰할 수 없는 사용자 입력을 파싱하는 복합 네이티브 코드입니다. BoundSan 사용 설정과 관련된 성능 오버헤드는 안전한 것으로 증명할 수 없는 배열 액세스 수에 종속됩니다. 평균적으로 약간의 오버헤드 비율을 예상해야 하며, 성능에 대한 우려가 있는 경우 테스트하세요.

청사진 파일에 BoundSan 사용 설정

BoundSan을 청사진 파일에 사용 설정하려면 바이너리 및 라이브러리 모듈의 misc_undefined sanitize 속성에 "bounds"를 추가해야 합니다.

sanitize: {
   misc_undefined: ["bounds"],
   diag: {
      misc_undefined: ["bounds"],
   },
   blacklist: "modulename_blacklist.txt",

diag

diag 속성은 새니타이저에 진단 모드를 사용 설정합니다. 테스트 중에만 진단 모드를 사용합니다. 진단 모드는 완화의 보안 이점을 무색하게 하고 더 높은 성능 오버헤드를 수반하는 오버플로에 대해 취소되지 않으므로 프로덕션 빌드에 사용하지 않는 것이 좋습니다.

blacklist

blacklist 속성은 개발자가 사용 가능한 차단 파일을 지정하여 함수 및 소스 파일이 처리되지 않도록 합니다. 성능에 대한 우려가 있고 타겟팅된 파일/함수의 기여가 상당한 경우에만 이 속성을 사용하세요. 배열 액세스가 안전한지 확인하려면 이러한 파일/함수를 수동으로 감사하세요. 자세한 내용은 문제해결을 참조하세요.

makefile에 BoundSan 사용 설정

BoundSan을 makefile에 사용 설정하려면 "bounds"를 바이너리 및 라이브러리 모듈의 LOCAL_SANITIZE 변수에 추가해야 합니다.

LOCAL_SANITIZE := bounds
# Optional features
LOCAL_SANITIZE_DIAG := bounds
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt

LOCAL_SANITIZE는 쉼표로 구분된 새니타이저 목록을 허용합니다.

LOCAL_SANITIZE_DIAG는 진단 모드를 켭니다. 테스트 중에만 진단 모드를 사용합니다. 진단 모드는 완화의 보안 이점을 무색하게 하고 더 높은 성능 오버헤드를 수반하는 오버플로에 대해 취소되지 않으므로 프로덕션 빌드에 사용하지 않는 것이 좋습니다.

LOCAL_SANITIZE_BLACKLIST는 개발자가 사용 가능한 차단 파일을 지정하여 함수 및 소스 파일이 처리되지 않도록 합니다. 성능에 대한 우려가 있고 타겟팅된 파일/함수의 기여가 상당한 경우에만 이 속성을 사용하세요. 배열 액세스가 안전한지 확인하려면 이러한 파일/함수를 수동으로 감사하세요. 자세한 내용은 문제해결을 참조하세요.

BoundSan 사용 중지

차단 또는 함수 속성으로 함수 및 소스 파일에서 BoundSan을 사용 중지할 수 있습니다. BoundSan은 사용 설정 상태를 유지하는 것이 좋으므로 함수나 파일이 대량의 성능 오버헤드를 생성하고 소스가 수동으로 검토된 경우에만 사용 중지하세요.

함수 속성차단 파일 형식으로 BoundSan을 사용 중지하는 자세한 방법은 Clang LLVM 문서를 참고하세요. 다른 새니타이저가 영향을 받지 않도록 하려면 타겟 새니타이저를 지정하는 섹션 이름을 사용하여 차단 범위를 특정 새니타이저로 한정하세요.

유효성 검사

BoundSan 전용 CTS 테스트는 없습니다. 대신 CTS 테스트가 BoundSan 사용 여부와 상관없이 통과되도록 하여 기기에 대한 영향이 없는지 확인하세요.

문제해결

BoundSan을 사용 설정한 후에는 구성요소를 꼼꼼히 테스트하여 이전에 감지되지 않은 모든 범위 밖의 액세스가 해결되었는지 확인하세요.

BoundSan 오류는 다음과 같은 Tombstone 취소 메시지를 포함하므로 쉽게 식별 가능합니다.

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: out-of-bounds'

진단 모드에서 실행할 때는 소스 파일, 행 번호 및 색인 값이 logcat에 출력됩니다. 기본적으로 이 모드는 취소 메시지가 발생하지 않습니다. logcat을 검토하여 오류가 없는지 확인하세요.

external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'