심볼릭 링크 공격으로부터 Linux 시스템 보호

심볼릭 링크 공격으로부터 Linux 시스템 보호

Linux 기반 시스템은 권한이 없는 UID 프로세스의 심볼릭 링크 경합 공격에 취약합니다. ~을 위한, 공유 호스트의 PHP 프로세스는 디렉토리의 /etc/passwd에 대한 심볼릭 링크를 생성할 수 있으며, 여기서 Apache httpd는 인터넷의 모든 사람이 심볼릭 링크를 사용할 수 있도록 만듭니다. 심볼릭 링크 관련 문제의 다른 예는 다음을 참조하세요.

https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=linux+symlink+race

의심스러운 프로세스에 의해 생성된 악성 심볼릭 링크로부터 모든 버전의 모든 Linux 시스템을 보호할 수 있는 방법을 원합니다.

몇 가지 부분적인 해결 방법이 있지만 일반적으로 Linux 커널의 사용자 지정 패치(작업량이 많고 업데이트 프로세스 속도가 느려질 수 있음)가 포함되거나 충분히 제한적이지 않습니다. Kees Cook의 패치는 Linux 3.6 이상에서 사용 가능

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=800179c9b8a1e796e441674776d11cd4c05d61d7

그러나 이는 모든 이전 Linux 버전에 존재하지 않으며 반드시 모든 문제가 아닌 일부 심볼릭 링크 문제만 방지합니다(예: 여전히 문제가 되는 고정되지 않은 비트 디렉터리에 심볼릭 링크 생성).

버전 2.6.26부터 모든 일반적인 Linux 시스템에 적용되는 심볼릭 링크 레이스 취약점에 대한 범용 솔루션은 무엇입니까?

내가 생각한 것 중 하나는 UID가 높은 사용자가 심볼릭 링크를 생성하지 못하도록 전역 규칙을 설정하는 것이었습니다. 일부 배포(공유 호스팅)의 경우 이러한 제한이 허용될 수 있습니다.

Linux 커널 >= 2.6.26을 사용하는 시스템에서 사용자가 심볼릭 링크를 생성하지 못하도록 하는 가장 간단한 방법은 무엇입니까?(단, 루트를 포함하여 심볼릭 링크를 지원하려면 더 많은 권한이 있는 사용자가 필요합니다)

SELinux, Seccomp-bpf 및 Apparmor 중 이러한 제한을 설정하는 데 가장 적합한 것은 무엇입니까?

답변1

Apache가 심볼릭 링크를 생성하는 것을 방지해도 심볼릭 링크가 깨지지 않을 수 있습니다.

존재하다현재의Linux에는 새 기호 링크를 생성하기 위한 두 가지 시스템 호출이 있습니다: symlinksymlinkat.

man systemd.execsystemd가 특정 시스템 호출을 거부하기 위해 seccomp 필터를 설치할 수 있다고 알려주세요 SystemCallFilter=~symlink symlinkat. 에 따르면 man systemd.unit기존 시스템 서비스 파일은 "삽입" 파일을 사용하여 수정할 수 있습니다 /etc/systemd/system/httpd.service.d/nosymlink.conf.

편집: 물론 별도의 시스템 서비스에서 PHP를 FastCGI로 실행하는 경우 httpd.

이 "블랙리스트" 접근 방식에는 다음과 같은 큰 주의 사항이 있습니다.

운영 체제를 새로운 커널로 업그레이드하면 새로운 시스템 호출에 대한 지원이 추가될 수 있습니다. 불행하게도 최신 버전에서도 symlinkat()flags 매개변수가 추가되지 않습니다. 따라서 symlinkat어떤 방식으로든 동작을 수정해야 하는 경우 나중에 새로운 시스템 호출을 추가해야 할 수도 있습니다. 아이러니하게도 가장 가능성이 높은 이유는 다음을 추가하는 것입니다.AT_BENEATH지원하다 symlinkat. 예를 들어, 최신 버전의 GNU libc가 symlinkat2()새로운 시스템 호출을 통해 모든 심볼릭 링크 생성을 수집하는 경우 "취약성"이 다시 발생할 수 있습니다 .

답변2

Linux에서는 불변 비트 옵션을 사용할 수 있습니다.

불변 속성을 가진 파일은 다음과 같을 수 없습니다:

  1. 수정됨
  2. 삭제됨
  3. 이름을 바꿔라
  4. 누구도(루트 사용자 포함) 소프트 링크나 하드 링크를 생성할 수 없습니다.

chattr(운영 체제가 지원하는지 확인) 명령을 사용하여 속성을 설정합니다.

chattr +i file
chattr +i /path/to/filename

파일 wrt 속성 비트의 속성을 나열합니다.

lsattr /etc/shadow

불변 비트를 제거하려면:

chattr -i file
chattr -i /path/to/filename

답변3

PHP가 /etc/passwd를 읽지 못하도록 하려면 임의의 명령 실행을 비활성화해야 합니다.

그렇다면 당신은 이미 호출되는 것을 비활성화하는 방법을 알고 있습니다 symlink().

PHP가 "안전 모드"를 더 이상 사용하지 않고 제거했으며 아직 공식적인 사용 가이드가 없다는 것을 확인했습니다.disable_functions.

관련 정보