Android에서 dac_override의 원인을 식별하는 방법은 무엇입니까?

Android에서 dac_override의 원인을 식별하는 방법은 무엇입니까?

저는 일부 Android 사용자 정의 작업을 하고 있는데, 제가 작성 중인 한 애플리케이션 dac_override에서 dmesg 결과가 다음과 같이 표시됩니다.

type=1400 audit(499405.329:16): avc: denied { dac_override } for 
pid=1103 comm="my_tool" capability=1 scontext=u:r:my_tool:s0
tcontext=u:r:my_tool:s0 tclass=capability permissive=1

나는 문제를 일으키는 실행 파일( my_tool)을 알고 있으며 이는 dac_override실행 파일에 작업을 수행할 수 있는 기존 Linux 권한이 없다는 것을 의미하지만 어떤 작업이 시도되었고 어떤 파일이 시도되었는지 알 수 없습니다. 어떻게 답을 찾을 수 있나요?

dac_override또한 부수적인 질문으로 SELinux 이름과 동작이 기존 Linux 권한 위반을 처리할 수 있다고 생각합니까 ?

답변1

체계적인 접근방식은

1) SELinux를 통과하도록 설정합니다 setenforce 1. SELinux 위반으로 인해 해당 시스템 호출이 my_tool실패해야 합니다. 이를 사용하여 getenforce성공을 확인할 수 있습니다.

2) 실패한 시스템 호출을 식별하기 위해 다음과 같이 my_tool실행 합니다.stracestrace my_tool 2>&1 | grep '= -'

내 경우에는 다음과 같은 위반 사항이 있습니다.type=1400 msg=audit(4816808.488:3): avc: denied { dac_override } for pid=123 comm="my_tool" capability=1 scontext=u:r:my_tool:s0 tcontext=u:r:my_tool:s0 tclass=capability permissive=0

달리는strace my_tool 2>&1 | grep '= -'

openat(AT_FDCWD, "/some/file", some_mode) = -1 EINVAL (Invalid argument)

런타임에 사용자가 파일을 소유하고 있는지 ls -l /some/file, 파일에 대한 DAC 권한으로 인해 다른 사용자가 해당 파일에 액세스할 수 없는지 확인하십시오. 물론 사용자는 이 제한을 우회하지만 SELinux에서는 위반이 발생합니다(systemmy_toolrootrootdac_overwrite인용하다). 따라서 마지막 질문과 관련하여 SELinux는 기존 DAC 권한 우회를 허용하지 않지만 사용자에게 이러한 권한을 적용하는 데에도 사용할 수 있습니다 root.

물론 이 접근 방식의 효율성은 my_tool정상 작동 중에 처리하는 다른 실패한 시스템 호출 수의 복잡성에 따라 다소 달라집니다.

답변2

일반적인 조언전체 시스템 호출 감사 활성화일부 경로 정보를 얻으려면 이 유형의 AVC를 사용하십시오. 하지만 안드로이드는 지원하지 않는 것 같습니다. 따라서 strace시스템 호출을 사용하거나 추적하여 perf trace실패한 파일과 관련된 시스템 호출을 찾는 것이 차선책입니다.

당신은 또한 볼 수 있습니다

DAC_OVERRIDE 디버깅(Android에서), 2019년에 출시되어 AVC가 발생할 때 일부 호출 스택을 얻기 위해 Android 커널을 수정하는 방법을 설명합니다. 이것은 물론 약간 침해적이며 접근할 수 없는 경우에만 가치가 있는 것 같습니다 . 유사한 정보를 얻기 위해 탐지기를 설치할 수 있는 사람이 누가 있기 perf때문입니다 .perf

관련 정보