GHOST ( CVE- 2015-0235 )가 방금 나타납니다. 내 시스템이 안전한지 어떻게 신속하게 확인할 수 있습니까? 한 줄의 셸 명령을 사용하는 것이 이상적입니다.

ZDNet 기사에 따르면 “그런 다음 시스템을 재부팅해야합니다”. 이상적으로는 테스트에서도 이것을 표시합니다 …

댓글

  • "로 승격하는 것이 좋습니다. 솔직한 질문 "
  • 좋은 질문입니다. 한 줄 셸 명령이 아니라 전체 개발자 도구 모음이 설치되어 있어야한다는 답변을 수락 한 것이 너무 아쉽습니다. 라우터와 같은 중요 기기에는 대부분 ' gcc가 없습니다. 일부 기기는 ' 셀프 호스트도 할 수 없습니다.
  • 당신이 ' @BenVoigt가 맞습니다. 개발자 도구가 필요하지 않은 ' 1 라이너로 답변에 대한 현상금을 걸었습니다.
  • t 자체 호스트, uClibc 및 dietlibc는 glibc보다 훨씬 더 가능성이 높습니다. 크로스 컴파일러를 드래그하기 전에 ' 실제로 glibc에서 실행 중인지 확인하십시오.

답변

시카고 대학교 에서 시스템의 취약점을 테스트 할 수있는 도구를 다운로드 할 수 있습니다. .

아무것도 복구하거나 다시 시작하지 않습니다. 시스템이 취약한 경우에만 알려줍니다.

$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c $ gcc GHOST.c -o GHOST $ ./GHOST [responds vulnerable OR not vulnerable ] 

원격 서버 중 하나에서 실행 :

user@host:~# wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c --2015-01-27 22:30:46-- https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c Resolving webshare.uchicago.edu (webshare.uchicago.edu)... 128.135.22.61 Connecting to webshare.uchicago.edu (webshare.uchicago.edu)|128.135.22.61|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1046 (1.0K) [text/x-csrc] Saving to: `GHOST.c" 100%[============================================>] 1,046 --.-K/s in 0s 2015-01-27 22:30:48 (237 MB/s) - `GHOST.c" saved [1046/1046] user@host:~# gcc GHOST.c -o GHOST user@host:~# ./GHOST vulnerable 

해당 스크립트의 소스 코드는 다음 코드 블록 처럼 보이지만 어쨌든 먼저 원본 코드를 검사해야합니다 . 다른 사람들이 지적했듯이 코드가 무엇을하는지 모르고 인터넷에서 임의로 코드를 실행하면 나쁜 일이 발생할 수 있습니다 :

/* * GHOST vulnerability check * http://www.openwall.com/lists/oss-security/2015/01/27/9 * Usage: gcc GHOST.c -o GHOST && ./GHOST */ #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #define CANARY "in_the_coal_mine" struct { char buffer[1024]; char canary[sizeof(CANARY)]; } temp = { "buffer", CANARY }; int main(void) { struct hostent resbuf; struct hostent *result; int herrno; int retval; /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/ size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1; char name[sizeof(temp.buffer)]; memset(name, "0", len); name[len] = "\0"; retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno); if (strcmp(temp.canary, CANARY) != 0) { puts("vulnerable"); exit(EXIT_SUCCESS); } if (retval == ERANGE) { puts("not vulnerable"); exit(EXIT_SUCCESS); } puts("should not happen"); exit(EXIT_FAILURE); } 

편집 : 많은 수가있는 경우 누구나 사용할 수있는 경우 ansible 플레이 북 여기 를 추가했습니다. 테스트 할 시스템의 수는 ansible을 사용하여 신속하게 수행 할 수 있습니다.

또한 아래 논의에 따라 서버가 취약하고 사용 가능한 패치를 적용하는 경우 시스템을 재부팅하는 것이 좋습니다 .

댓글

  • @KasperSouren 그렇습니다. 취약한 경우 패치 / 업그레이드를 적용하고 재부팅하십시오.
  • @KasperSouren ' 당신이 묻는 것은 솔직히 약간 어리석은 것입니다. 이 답변은 귀하의 질문에 완벽하게 대답합니다.이 취약점을 어떻게 감지합니까? 그게 ' 당신이 요청한 전부입니다. " 하나의 라이너 "를 요청하는 것도 약간 어리 석습니다. 나는 그가 여기에 게시 한 테스트를 2 분 이내에 내 모든 서버에서 실행했습니다. ' 아주 간단합니다. " 종료 -r 지금 " ' 완료 후 ….. ..
  • 업그레이드하고 테스트를 실행했지만 ' 재부팅하지 않았습니다. 재부팅해야한다는 것을 알았을 때만이 문제로 돌아 왔습니다. 이것은 상당수의 사람들에게 발생할 수 있으며 그들의 서버는 취약 할 수 있으며 잘못된 보안 감각에도 불구하고 해킹 당할 수 있습니다. 가능하다면이 문제를 바로 잡는 것은 어리석은 일이 아닙니다.
  • GHOST.c POC는 원래 Qualys에서 시작되었습니다. 권고 .
  • @KasperSouren 테스트를 통해 새로운 프로그램이 안전한 glibc 버전을 사용할 것임을 알 수 있습니다. 그러나 업그레이드 전에 시작된 프로그램이 백그라운드에서 실행되어 이전 버전을로드했을 수 있습니다.

답변

PHP 원 라이너 :

php -r "$e="0";for($i=0;$i<2500;$i++){$e="0$e";gethostbyname($e); }" 

Python 원 라이너 :

python -c "import socket;y="0"*50000000;socket.gethostbyname(y)" 

그것들이 당신에게 세그 폴트 (예, 파이썬 세그 폴트, 드문 표본)를 준다면 당신은 취약한 것입니다. 저는 당신이 파이썬을 “개발자 도구”라고 생각하는지 모르겠지만 PHP는 일반적인 프로그램입니다.

대상 장치가 라우터 인 경우 제조업체 사양을 파헤 치고 제조업체 권고 및 펌웨어 업데이트를 기다리는 것 외에는 사용자가 할 수있는 일을 알 수 없습니다.

댓글

  • 이것을 sudo lsof | grep libc- | grep DEL"와 결합 할 수 있습니까?이를 방지하기 위해 다른 댓글에 제공됩니다. 사람들은 ' 이전 libc가 아직 사용중인 동안 안전하다고 생각합니다.이 추가로 ' 바운티를 즉시 제공합니다.
  • ' 쉘 명령이므로 & 이 명령은 glibc 패키지를 업데이트 한 후에 만 수행됩니다.업데이트 한 경우 '이 하나의 라이너가 실패합니다. 업데이트 vommamd를 그 사이에 넣습니까?
  • SUSE 11SP3에서 PHP를 사용했는데 패치 전후에 segfault가 없었습니다. 아이디어가 있으십니까?
  • @marcin ' 흥미 롭습니다. 나는 이것을 인터넷 소스에서 가져 왔고 많은 사람들이 segfaulting을보고합니다. 루프 수를 늘리면 어떤 일이 발생합니까? ('의 가치에 대해 Python 용 segfault는 일부 패치 시스템에서도 segfault를 수행합니다. 그 이유에 대해서는 설명하지 않습니다. ' s 발생합니다.)
  • uchicago 코드를 사용하여 4 바이트 이상 오버플로를 시도하면 gethostbyname ()이 오버플로 대신 오류 (EINVAL)를 반환하는 것처럼 보입니다. C를 사용하면 덮어 쓰는 것을 정확하게 제어 할 수 있습니다. PHP 또는 Python을 사용하면 덮어 쓰는 것이 중요하고 세그 폴트이거나 아무것도 아닐 수 있습니다. ' 시스템의 정확한 빌드에 따라 달라집니다. 그리고 gethostbyname("0"*50000000)의 Python segfault는 저에게 Python의 버그처럼 보입니다. (Ghost Python?)

Answer

aaronfay “의 답변은 이미 기본 시스템이 취약한 지 여부를 확인하는 데 적용되었습니다. 그러나 업그레이드 후에도 이전 버전의 glibc를 사용하여 실행중인 프로그램이 있는지 감지하지 못합니다. 즉, 영향을받는 프로세스를 다시 시작하지 않고 업그레이드 할 수 있으며 이전의 취약한 라이브러리가 아직 사용 중임에도 불구하고 스크립트는 “취약하지 않음”을보고합니다.

다음은 해당 라이브러리가 있는지 확인하는 한 가지 방법입니다. 여전히 이전 버전의 glibc를 사용하는 동적 링크 프로그램 :

sudo lsof | grep libc- | grep DEL 

결과가있는 경우 삭제 된 버전의 glibc가 사용 중이며이를 사용하는 프로세스는 취약합니다.

물론 glibc가 정적으로 링크 된 경우는 다루지 않습니다. 좋은 소식은 바이너리에서 정적으로 링크 된 glibc를 찾는 것이 매우 드뭅니다. 다른 성가심과 어려움이 있기 때문입니다. 정적으로 컴파일 된 glibc를 사용하는 프로그램이 있는 경우 (거의 확실하지 않음) 다시 컴파일해야합니다.

코멘트

  • lsof +c0 -f -- /usr/lib64/libc-*.so | grep "(deleted)$" 좀 더 정확하고 프로세스의 전체 이름을 표시하며 삭제 된 파일에 대한 링크를 찾습니다.

답변

Redhat에 계정이있는 경우 이 URL . glibc가 취약한 지 여부를 알려주는 작은 셸 스크립트입니다.

Red Hat이 돌아 왔습니다. 탐지기 스크립트에 결함이 있다고 밝혔습니다. https://bugzilla.redhat.com/show_bug.cgi?id=1186717 .

댓글

  • RedHat 도구는 glibc RPM의 버전 만 확인합니다. , 그리고 그것만 RedHat 버전 (및 파생물)에 대해 알고 있습니다. 실제로 다른 OS에서는 작동하지 않습니다.
  • 결함으로 인해 더 이상 다운로드 할 수 없습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다