2013-03-29 1 views
0

내 프로그램은 사용자가 지정한 디렉토리에 기록 된 바이너리에서 exec()를 호출합니다. 디렉토리가 "noexec"로 마운트 된 트리에 있으면 EACCES로 exec()가 실패합니다.파일에 exec()를 호출하기 전에 마운트 지점에 noexec가 설정되어 있는지 검색 하시겠습니까?

exec()가 실패하는 대신에 noexec으로 디렉토리가 마운트되었지만 fcntl(), stat() 또는 mount() 중 아무 것도이 정보를 읽지 못하는 것을 알아낼 수 있기를 원합니다. 맨 페이지). exec 시스템 호출을위한 커널 소스를 보면,이 정보가 inode의 메타 데이터에 저장되어있는 것처럼 보입니다. 그리고이 정보가 시스템 호출로부터 반환되는 것을 볼 수 없습니다.

673  struct nameidata nd; 
(..) 
677  err = path_lookup_open(AT_FDCWD, name, LOOKUP_FOLLOW, &nd, FMODE_READ|FMODE_EXEC); 
678  file = ERR_PTR(err); 
(..) 
682   file = ERR_PTR(-EACCES); 
683   if (!(nd.mnt->mnt_flags & MNT_NOEXEC) && 
684    S_ISREG(inode->i_mode)) { 

누구든지이 작업을 수행 할 수있는 방법을 알고 있습니까?

감사합니다.

+2

검사 뭐가 잘못() exec가 EACCES에 실패하면? –

+2

실제로, 작업을 수행하기 전에 작업이 실패하는지 확인하려고 시도하는 대신 오류를 확인하는 대신 ** 거의 항상 버그 **입니다. –

+0

@JesusRamos : 아무 문제가 없으므로 오류를 일찍 신고하고 싶습니다. – Mayank

답변

1

사용할 수를보고 statvfs

struct statvfs st; 
inr rc = statvfs("/mnt/foo", &st); 
if (rc == -1) 
    error(); 
if (st.f_flag & ST_NOEXEC) { 
//no exec flags was set 
} 
+0

고마워,이 일을하지만 "/ mnt/foo/bar"가 statvfs에 인수로 전달되면 실패합니다. f_flags에는 ST_NOEXEC 세트가 없으며/mnt/foo만이 설정됩니다. – Mayank

+0

http://stackoverflow.com/questions/2337139/where-is-a-file-mounted?rq=1에서 제안 된대로/proc를보고있는 Mac에서 코드 작업을 수행해야합니다. – Mayank

+0

Bah, 나는 realpath() + stat()를 사용하여 장치를 비교하는 다른 옵션을 선호하지 않습니다. 신경 쓰지 마. – Mayank

0

/proc/mounts을 읽은 다음 프로그램 바이너리가 상주하는 파일 시스템을 확인하는 것을 고려 했습니까? 아마도 statfs(2) 및/또는 realpath(3)을 사용하고 있을까요?

그러나 항상 여러 가지 이유로 실패 할 수있는 execve(2) 및 관련 exec 함수의 실패를 신경 써서 처리해야합니다.

execve에는 여러 가지 방법이 있지만 그 중 일부는 쉽게 재생할 수 없습니다. fork 또는 다른 syscall의 실패에도 마찬가지입니다.

당신이 절대적으로 &이 (더 복잡한 일을, statfs 및/또는 realpath/proc/mounts의 스캔을 noexec 마운트 더 많은 옵션을 설명 잡을려면 내가 떠나 (execve의)를 EACCESS 오류를보고, 또는 것 중 하나 또는 /proc/self/mounts).

을 -ing execve 전에 바이너리 경로를 테스트에서 더 많은 포인트가 없습니다 ... 바로 뒤에 오류 ...

관련 문제