몇 가지 CTF 과제를 구현 중입니다. 이러한 플래그는 프로그램에서 읽는 일부 텍스트 파일에 있습니다. 플래그를 보호하기 위해 파일 소유자를 변경했지만 setuid
파일을 읽을 수 있도록 실행 가능하게 만들었습니다. gdb 외부에서 프로그램을 실행하면 작동하는 플래그를 읽을 수 있지만 gdb 내부에서는 Permission denied
VirtualBox의 Linux 가상 머신에서 연습을 실행하고 있습니다. sudoers 파일에 없는 일반 사용자를 만들었고 플래그 파일은 루트에 속합니다.
-rwsr-xr-x 1 root user 15260 Mar 13 13:22 exercise6
-rw-r--r-- 1 user user 3270 Mar 13 06:10 'Exercise 6.c'
-rwsr-xr-x 1 root user 15700 Mar 14 03:28 exercise7
-rw-r--r-- 1 user user 4372 Mar 13 06:10 'Exercise 7.c'
-rwS------ 1 root root 28 Mar 13 06:10 admin_flag.txt
-rwS------ 1 root root 20 Mar 13 06:24 exercise1.txt
-rwS------ 1 root root 27 Mar 13 06:24 exercise2.txt
-rws------ 1 root user 18 Mar 13 10:34 exercise3.txt
-rwS------ 1 root root 22 Mar 13 06:24 exercise4.txt
-rwS------ 1 root root 19 Mar 13 06:10 user_flag.txt
답변1
setuid1의 보안 계약은 실행 프로그램에 추가 권한을 부여한다는 것입니다. 이러한 권한은 이 프로그램에만 부여됩니다. 호출 사용자가 프로그램이 수행하지 않는 작업을 수행하도록 허용해서는 안 됩니다.
이로 인해 setuid는 추적( ptrace
대부분의 Unix 변형에서 시스템 호출)과 호환되지 않습니다. 호출 사용자가 프로그램의 내부 작업을 관찰할 수 있으면 프로그램이 액세스할 수 있는 모든 기밀 데이터에 액세스할 수 있습니다. 그러나 이는 사용자가 볼 수 없는 기밀 데이터일 수 있으며 프로그램은 일반적으로 이 데이터를 공개하지 않습니다. 아마도 더 분명하게 말하면, 호출하는 사용자가 프로그램이 수행하는 작업을 변경할 수 있는 경우(가능한 경우 ptrace
) 이는 setuid 사용자의 모든 권한에 대한 전체 액세스 권한을 부여하며, 이는 하나의 특정 프로그램만 실행할 수 있는 권한을 부여하려는 목표를 완전히 무너뜨리는 것입니다. 추적은 프로그램 실행을 검사하고 제어하기 위해 GDB와 같은 디버거에서 사용하는 기능입니다.
unix_chkpwd
예를 들어, 호출하는 사용자의 비밀번호를 확인하는 작업을 수행하는 프로그램을 생각해 보세요 . 프로그램은 기밀 데이터(비밀번호 해시 데이터베이스)를 읽을 수 있어야 합니다. 그러나 호출 사용자는 전체 데이터베이스를 읽을 수 없어야 합니다. 호출 사용자는 해당 사용자의 항목을 쿼리하고 예/아니요로만 대답할 수 있어야 하며(비밀번호 해시 자체를 추출하지 않고) 무차별 대입 공격을 방지하기 위한 속도 제한이 있어야 합니다. 비밀번호 해시 데이터베이스의 내용을 실행하고 인쇄할 수 있다면 gdb unix_chkpwd
해당 데이터베이스의 보안이 완전히 무너질 것입니다.
보안을 유지하려면:
- 프로그램이 시작 시 이미 추적되면 setuid 비트는 무시됩니다. 실행 파일은 추가 권한 없이 시작됩니다.
- 추가 권한으로 시작된 프로그램의 루트 추적만 허용합니다.
1이는 상승된 권한으로 프로그램을 실행하기 위한 setgid, setcap 또는 기타 유사한 메커니즘에도 적용됩니다.