항상 존재하고 "일반" 사용자가 해당 파일에 액세스할 수 없는 파일이 있습니까?

항상 존재하고 "일반" 사용자가 해당 파일에 액세스할 수 없는 파일이 있습니까?

단위 테스트를 위해 이것이 필요합니다. 할 수 있는 기능이 있어요통계자료인수로 전달된 파일 경로입니다. 실패한 코드 경로를 트리거해야 합니다 lstat(코드 적용 범위가 90%여야 하기 때문).

이 테스트는 단일 사용자로만 실행할 수 있으므로 Ubuntu에 항상 존재하는 파일이 있는지 궁금합니다. 일반 사용자는 해당 파일이나 해당 폴더에 대한 읽기 권한이 없습니다. (따라서 lstat루트로 실행하지 않으면 실패하게 됩니다.)

존재하지 않는 파일은 내가 트리거한 별도의 코드 경로가 있으므로 솔루션이 아닙니다.

편집: 파일에 대한 읽기 액세스 권한이 부족한 것만으로는 충분하지 않습니다. 이것은 lstat여전히 ​​작동합니다. /root에 폴더를 생성하고 그 안에 파일을 생성하여 (루트 액세스 권한이 있는 로컬 컴퓨터에서) 이를 트리거할 수 있었습니다. 그리고 해당 폴더의 권한을 700으로 설정해주세요. 그래서 루트로만 접근할 수 있는 폴더에서 파일을 검색하고 있습니다.

답변1

/proc/1/fdinfo/0최신 Linux 시스템에서는 (프로세스 ID 1의 파일 설명자 1(stdout)에 대한 정보( init로 실행되어야 하는 루트 pid 네임스페이스에 있음 root))를 사용할 수 있어야 합니다 .

일반 사용자로서 목록을 찾을 수 있습니다:

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

( -type f일반 파일로 제한하지 않으려면 제거하세요).

/var/cache/ldconfig/aux-cacheUbuntu 시스템만 고려한다면 이는 또 다른 잠재적인 후보입니다. /var/cache/ldconfig루트에 대한 읽기+쓰기+검색 가능은 GNU libc와 함께 제공되는 명령을 통해서만 생성될 수 있으므로 대부분의 GNU 시스템에서 작동합니다 .ldconfig

답변2

보고 있다통계(2)매뉴얼 페이지는 ENOENT(파일이 존재하지 않음) 이외의 오류로 인해 실패할 수 있는 상황에 대한 영감을 제공합니다.

가장 분명한 것들은 다음과 같습니다:

유럽 ​​항공 우주 센터 경로 접두사의 디렉터리 중 하나에 대한 검색 권한이 거부되었습니다..

따라서 검색할 수 없는 디렉토리가 필요합니다.

예, 시스템에 이미 존재하는 항목을 찾을 수 있지만(아마도 /var/lib/private존재할까요?) 다음과 같이 직접 생성할 수도 있습니다.

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

lstat(2) 작업은 EACCES로 인해 실패합니다. (디렉토리에서 모든 권한을 제거하면 이를 보장할 수 있습니다. 그렇게 많은 권한이 필요하지 않을 수도 있습니다. chmod -x실행 권한을 제거하는 것만으로도 충분합니다. 디렉터리 아래에 있는 파일에 액세스하려면 디렉터리에 실행 권한이 필요하기 때문입니다.)

lstat(2)를 실패하게 만드는 또 다른 창의적인 방법이 있습니다. 매뉴얼 페이지를 확인하십시오:

에노딜 경로 접두어의 구성 요소디렉토리가 아닙니다.

따라서 이와 같은 파일에 액세스하려고 하면 /etc/passwd/nonexistent이 오류가 발생합니다. 이 오류는 ENOENT("해당 파일이나 디렉터리가 없습니다")와는 다르며 사용자의 요구에 적합할 수 있습니다.

또 다른 하나는 다음과 같습니다

에나툴론 너무 오래.

그러나 매우 긴 이름을 원할 수도 있습니다. (4,096바이트가 일반적인 제한이라고 생각하지만 시스템/파일 시스템의 이름이 더 길 수도 있습니다.)

궁극적으로 이것이 될지 여부를 말하기는 어렵습니다.실제로그것은 당신을 위해 작동합니다. "파일이 존재하지 않습니다" 시나리오를 유발하지 않는 것을 원한다고 말씀하셨습니다. 이는 일반적으로 ENOENT 오류를 의미하지만 실제로는 많은 상위 수준 검사에서는 lstat(2)의 모든 오류를 "존재하지 않음"으로 해석합니다. 예를 들어, test -e또는 쉘의 이에 상응하는 항목은 [ -e ...]위의 모든 내용을 "존재하지 않음"으로 해석할 수 있습니다. 특히 다른 오류 메시지를 반환하는 좋은 방법이 없고 오류를 반환하지 않는 것은 파일이 존재하지만 이는 분명히 사실이 아닙니다.

답변3

스스로 할 find수 있습니다.

/etc--config 파일 디렉토리를 시작점으로 사용하십시오 .

sudo find /etc -type f -perm 0400 -user root

내 시스템에서는 아무것도 반환하지 않습니다.

덜 제한적이고 허용된 그룹일 수 있으며 root(사용자만 root그룹의 구성원이어야 함 root) 다음 권한에 유의하십시오 440.

sudo find /etc -perm 0440 -user root -group root

내 시스템에서는 다음을 반환합니다.

/etc/sudoers.d/README
/etc/sudoers

편집하다:

편집 내용에 따라 호출자에게 디렉터리 목록을 방지할 수 있는 충분한 권한이 없는 디렉터리를 찾고 있습니다.

sudo find / -perm o-rwx -type d -user root -group root 

-type d여기서는 다른 사람( )의 읽기-쓰기 실행 권한 비트가 없고 o-rwx. root:root( )이 소유한 디렉터리를 찾고 있습니다 .

기술적으로, 단지 실행() 비트가 누락되면 x디렉토리에 디렉토리()가 나열되지 않습니다.lstat(2)

/run/systemd/inaccessible/출력에서 Systemd init 기반 시스템에서 찾았습니다.

/proc/sys, 및 파일 정보 /dev:

  • 이러한 파일 시스템은 가상 파일 시스템입니다. 즉, 디스크가 아닌 메모리에 상주합니다.

  • 에 의존하려는 경우 후속 PID(프로세스)가 존재한다고 보장되지 않으므로 신뢰성/일관성을 위해 후속 PID 대신 PID 1 아래의 항목에 의존하십시오 /proc./proc/1/

관련 정보