죽음의 핑! FreeBSD는 네트워크 도구인 PlatoBlockchain Data Intelligence의 심각한 충돌 버그를 수정했습니다. 수직 검색. 일체 포함.

죽음의 핑! FreeBSD는 네트워크 도구의 crashtastic 버그를 수정합니다.

모든 컴퓨터 사용자가 배우는 최초의 저수준 네트워크 도구 중 하나는 ping 유용.

잠수함과 관련된 모든 구식 전쟁 영화 장면의 이름을 딴 이 명령은 SONAR로 알려진 RADAR 수중 버전의 은유적 메아리입니다(우리가 거기서 무엇을 했는지 보세요).

당신은 핑을 보냅니다 (doinnnng 소음과 비슷합니다. 현실)를 염수 깊이로 이동하고 으스스한 메아리가 돌아오는 데 걸리는 시간을 측정하고 주변 바다의 음속을 추정하여 메아리를 생성한 물체까지의 거리를 계산할 수 있습니다.

흥미롭게도 인터넷을 강화하는 프로토콜 접착제에 대한 일반적인 설명으로 사용되는 약어 TCP/IP를 들어본 적이 있을 것입니다. ping 기술적으로 TCP/IP를 전혀 사용하지 않습니다.

사실, TCP/IP는 인터넷 프로토콜을 통한 전송 제어 프로토콜, 네트워크 자체가 "실제로 제대로 작동 했습니까?" 당신을 위한 노력.

예를 들어, TCP 연결에서 보내는 모든 데이터 청크는 다른 쪽 끝에 그대로 도착하거나 오류를 발생시켜 그들이 만들지 않았다는 것을 알 수 있도록 보장됩니다.

또한 서로 다른 데이터 청크가 인터넷에서 서로 다른 경로를 사용하게 되더라도(예: 로드 밸런싱, 일시적 중단 또는 기타 복구 가능한 오류로 인해) 일부 청크가 다른 청크보다 도착하는 데 시간이 오래 걸리더라도 TCP 데이터는 올바르게 버퍼링됩니다. 다른 쪽 끝에 올바른 순서로 표시됩니다.

핑이 다름

XNUMXD덴탈의 ping 그러나 명령은 일반적으로 관심 있는 컴퓨터가 전혀 온라인 상태인지 확인하는 데 사용되며, 특히 이메일 수신 또는 SSH 로그인 허용과 같이 예상되는 일종의 고급 TCP 연결을 허용하지 않는 경우에 사용됩니다.

이렇게 하면 중단이 네트워크나 서버 자체의 다운으로 인한 것인지 아니면 해당 서버에서 실행 중인 개별 서비스가 제대로 시작하지 못한 것인지 신속하게 판단할 수 있습니다.

그 결과, ping TCP보다 훨씬 낮은 수준의 프로토콜을 사용합니다.

과연, ping TCP의 더 캐주얼한 사촌인 UDP도 사용하지 않습니다. 사용자 데이터그램 프로토콜이는 데이터 청크를 빠르고 쉽게 전송하는 방법이지만 일반적으로 보내기 및 희망(또는 냉소적인 경우 스프레이 및 기도)이라고 합니다.

UDP 자체는 데이터가 상대방에게 도착했는지 여부를 알려주지 않으며, 온전하게 도착하더라도 UDP는 패킷이 원래 전송된 순서를 추적하지 않으므로 패킷을 다시 정렬할 수 없습니다. 그들이 순서를 벗어나면 다른 쪽 끝.

Ping, ICMP로 알려진 문제 해결 및 네트워크 재구성 목적을 위해 특별히 설계된 매우 낮은 수준의 실제로 프로토콜을 사용합니다. 인터넷 제어 메시지 프로토콜.

일반적으로 운영 체제 커널에서 바로 처리되므로 ICMP/IP 패킷은 더 높은 수준의 네트워킹 소프트웨어가 올바르게 작동하지 않더라도 거의 확실하게 통과할 수 있습니다. ICMP에는 특히 두 가지 특수 메시지 유형이 포함됩니다.

  • 0x08을 입력합니다. 공식적으로 전화 ICMP Echo일종의 패킷 일반적으로 에코 요청이라고 합니다. 그것은 무엇 ping 프로그램은 네트워크에서 활성 컴퓨터를 검색하기 위해 보냅니다.
  • 0x00을 입력합니다. 공식적으로 전화 ICMP Echo Reply, 이 패킷 유형은 정확히 그것이 말하는 것. 활성 상태이고 온라인 상태이며 ICMP Echo 트래픽을 차단하도록 구성되지 않은 컴퓨터는 이러한 종류의 패킷을 요청한 컴퓨터로 바로 다시 보내야 합니다.

이 같은 :

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com
패턴: 0x4e414b45445345435552495459
PING news-sophos.go-vip.net (192.0.66.227) 56(84) 바이트의 데이터.
64(192.0.66.227)의 192.0.66.227바이트: icmp_seq=1 ttl=53 time=84.0 ms
64(192.0.66.227)의 192.0.66.227바이트: icmp_seq=2 ttl=53 time=85.1 ms
64(192.0.66.227)의 192.0.66.227바이트: icmp_seq=3 ttl=53 time=84.8 ms

--- news-sophos.go-vip.net 핑 통계 ---
3개 패킷 전송, 3개 수신, 0% 패킷 손실, 시간 2004ms
rtt 최소/평균/최대/mdev = 84.025/84.644/85.062/0.446ms

보기 위해 ping 약간 더 낮은 수준에서 실제로는 이 기사의 끝에서 찾을 수 있는 Lua 코드를 사용하여 자체 ICMP Echo 패킷을 구성하고 반환되는 응답(있는 경우)을 읽습니다.

$ sudo luax ping.lua nakedsecurity.sophos.com
ICMP ECHO 요청을 192.0.66.227로 보내기 -->
00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ|
00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMessage BB5A6|
00000020 46 31 44 |F1D |
돌아왔습니다-->
00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.|
00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |........Zo.Ping|
00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |요청 메시지 B|
00000030 42 35 41 36 46 31 44 |B5A6F1D |

그건 그렇고, 우리는 사용해야했습니다 sudo 수퍼유저 권한으로 스크립트를 실행하기 위해 위의 스크립트를 실행했습니다. 원시 IP 소켓 – TCP, UDP 및 필요에 따라 ICMP를 포함하여 원하는 모든 기본 형식으로 제작할 수 있습니다.

많은 Linux/Unix 시스템에서 ping 배포판에서 제공하는 명령은 명시적으로 루트 권한을 부여받지 않고 작동합니다. 일반적으로 특별한 보안 기능과 함께 설치되기 때문입니다. setuid 플래그가 설정되었습니다. 즉, 실행한 사용자와 다른 사용자 계정으로 실행하는 것으로 시작됩니다.

잘 디자인 된 ping 물론 프로그램은 필요한 원시 소켓을 열면 추가 권한을 자동으로 폐기합니다.

간결함을 위해 샘플 스크립트에서 이 권한 드롭 코드를 생략했습니다. 당신은 사용할 수 있습니다 posix.unistd.setpid() 소켓을 만든 후 데이터를 보내거나 받기 전에 권한이 없는 계정으로 전환하는 기능.

답장 검토

위 스크립트의 데이터 덤프에서 알 수 있듯이 응답 서버에서 데이터를 다시 읽기 위해 사용하는 네트워크 소켓 기능에는 ICMP Echo Reply 데이터뿐만 아니라 저수준 IP(인터넷 프로토콜 헤더)도 포함됩니다. 기본 패킷에서.

우리는 이 데이터를 파싱하거나 달리 처리하려고 시도하지 않았지만 FreeBSD ping 프로그램은 반환되는 오류 메시지를 이해하는 것을 포함하여 응답을 이해하기 위해 그렇게 해야 합니다.

경우 ping 어떤 식으로든 거부되면 Echo Reply에는 일반적으로 자체 IP 헤더(위에서 볼 수 있음)뿐만 아니라 IP 헤더의 참조 복사본과 원래 아웃바운드 요청에 나타난 ICMP 데이터도 포함됩니다.

IPv4 패킷 헤더는 일반적으로 IP 헤더가 45 00 00 37... 다음과 같이 표시된 바이트를 포함하여 총 20바이트 동안 계속됩니다. ...XX XX XX XX, 내 노트북의 IP 주소입니다.

이 같은 :

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.|
00000010 XX XX XX |.... |

IP 버전 및 헤더 길이: 0x45(4 = IPv4, 5 = 32개의 20비트 단어, 즉 0바이트
서비스 유형 및 혼잡 데이터: 00x0
패킷의 총 길이: 0037x55(십진수 6)
시퀀스 정보: F00 AF 00 0
TTL(왼쪽으로 홉): 35x53(십진수 0)
프로토콜 유형: 01x0(ICMP)
체크섬: 947x38015F(십진수 0)
보내는 컴퓨터의 IP 번호: C00 42 3 E192.0.66.227 (XNUMX = nakedsecurity.sophos.com)
수신자 IP(내 노트북): XX XX XX XX (편집됨 = 내 IP 번호)

FreeBSD의 ping 프로그래머는 이러한 종류의 헤더가 첫 번째 바이트의 헤더 길이 값을 기준으로 항상 정확히 20바이트 길이라고 가정하는 것 같습니다. 0x45, IPv4를 나타냄(0x4?) 5-DWORD(0x?5) 또는 20바이트 헤더입니다.

걱정해야 할 20바이트만 있으면 프로그래머는 처리할 오류 조건이 있는 경우 응답에 있는 IP 헤더의 복사본과 원래 요청의 내장된 IP 헤더를 보관할 수 있는 고정 크기 버퍼를 스택에 할당했습니다. .

이것이 어디로 가고 있는지 짐작할 수 있습니다.

IPv4 헤더의 첫 번째 바이트는 합법적으로 모든 값을 가질 수 있습니다. 0x45 (그림과 같이 5 DWORD 또는 20바이트의 최소 헤더 크기) 최대 0x4F (15xF는 0진수 15 또는 총 헤더 데이터의 60바이트이기 때문에 40개의 DWORD를 나타냄) 따라서 헤더 데이터의 선택적 추가 XNUMX바이트를 깔끔하게 허용합니다.

드물지만 합법적인 추가 헤더 바이트는 선택적 연출 방송, 실험적 흐름 제어업스트림 멀티캐스트 패킷 – 우리가 들어 본 적이 있지만 고의로 사용하거나 본 적이 없는 것.

당신을 시험하는 사이버 범죄자를 조심하십시오

상상할 수 있듯이 이러한 추가 필드가 거의 사용되지 않는다는 점을 감안할 때 0x45 당신을 시험할 준비가 된 사이버 범죄자 무리를 만나지 않는 한 총 20바이트의 헤더 데이터로 시작할 수 있습니다.

슬프게도 FreeBSD를 사용하고 있는지 추측하는 서버를 조작하는 공격자를 막을 수 있는 방법은 많지 않습니다. 스택 버퍼 오버 플로우 당신의 내부 ping 프로그램)

서버가 활성화되어 있는지 확인하는 경우(심지어 또는 특히 의심스럽다고 생각되는 경우!) 부비 트랩 응답의 대상이 될 수 있습니다.

기껏해야 당신의 ping 프로그램이 충돌합니다. 그러나 최악의 경우 FreeBSD 보안 권고가 관대하게 인정하듯이 "악의적인 호스트가 ping에서 원격 코드 실행을 트리거할 수 있습니다."

다행스럽게도 FreeBSD 작성자는 지적, "핑 프로세스는 영향을 받는 모든 FreeBSD 버전의 기능 모드 샌드박스에서 실행되므로 버그가 발생할 수 있는 지점에서 시스템의 나머지 부분과 상호 작용할 수 있는 방법이 매우 제한적입니다."

즉, 반드시 패치를 적용해야 하지만 위험은 크지 않은 것으로 간주할 수 있습니다.

특히, ping 보안 권고에서 확인된 바와 같이 버그가 있는 코드에 도달하면 프로그램이 샌드박스에 잠겨 있을 뿐만 아니라 루트로 실행되지 않습니다. "언제 ping 실행되면 작업을 수행하는 데 필요한 원시 소켓을 생성한 다음 상승된 권한을 취소합니다.”

위에서 설명한 것처럼 수퍼유저 권한은 운영 체제에서 원시 IP 소켓을 획득하는 데만 필요하며 sendto()recvfrom() 나중에 해당 소켓에서 작동합니다.

이 버그에는 공식 식별자가 부여되었습니다. CVE-2022-23093; 보안 권고에 문서화되어 있습니다. FreeBSD-SA-22:15.ping.

무엇을해야 하는가?

  • FreeBSD 사용자라면, 영향을 받는 릴리스(FreeBSD 12 및 FreeBSD 13)를 이 버그가 수정된 최신 버전으로 업데이트하기만 하면 됩니다.
  • 당신이 네트워크 프로그래머라면, 비정상적인 크기 변형을 나타낼 수 있는 패킷 헤더를 고려했는지 항상 확인하십시오. 자신이 어떤 변형도 본 적이 없다는 사실이 내일 평범하지 않지만 완벽하게 합법적인 패킷에 직면하는 것을 막지는 못합니다.
  • 네트워크 관리자라면 크기가 4바이트가 아닌 IP 헤더가 있는 IPv20 패킷 차단을 고려하십시오. 일부 소프트웨어 제품이 비정상적인 IPv4 헤더 옵션을 사용하도록 진정으로 허용해야 하는 것 같으면 이러한 비정상적인 패킷을 기록하여 그 이유를 알아보십시오.

조심해!


PING 트래픽을 보여주는 예제 코드


타임 스탬프 :

더보기 노출 된 보안