( 1 ) 취약점 정보
2022년 10월 10일 FortiGuard 사의 보안공지에 [CVE-2022-40684] Forti 제품 인증 우회 취약점 관련하여 패치를 공지함.
해당 취약점은 FortiOS, FortiProxy 및 FortiSwitchManager 제품의 취약한 경로에 인증되지 않은 공격자가 특수하게 조작된 HTTP 또는 HTTPS 요청을 전송하여 관리 인터페이스에 악의적인 행위를 할 수 있는 취약점임.
현재 CVSSv3 9.6 점으로 위험한 취약점으로 분류됨.
영향을 받는 제품 리스트는 아래와 같음.
- FortiOS 5.x, 6.x 버전는 영향을 받지 않음
- FortiOS 7.2.0 ~ 7.2.1 버전
- FortiOS 7.0.0 ~ 7.0.6 버전
- FortiProxy 7.2.0 버전
- FortiProxy 7.0.0 ~ 7.0.6 버전
- FortiSwitchManager 7.2.0 버전
- FortiSwitchManager 7.0.0 버전
( 2 ) 취약점 분석
취약점 분석을 위해 FortiOS 7.2.1 버전에서 확인함.
/bin 폴더에는 많은 바이너리 컬렉션이 포함되어 있으며 그 중 다수는 /bin/init 에 대한 심볼릭 링크 파일임.
migadmin 폴더에는 관리 인터페이스에 대한 프론트엔드 웹 코드가 포함되어 있으며 node-script 폴더는 관리 인터페이스에 대한 Node.js 백엔드를 포함함.
마지막으로 usr 폴더에는 libaries 폴더와 apache2 구성 폴더가 있음.
취약한 버전과 패치된 버전을 각각 비교해보면 bin 폴더에서 큰 init 바이너리가 변경되었음을 확인하고 node-scripts 폴더에서 index.js 파일이 변경됨을 확인함.
취약한 버전과 패치된 버전의 각각 node-scripts 폴더 안에 index.js 파일을 비교한 화면은 아래와 같음.
< node-scripts 폴더 안에 index.js 파일 비교 화면 >
수정된 코드를 보면 httpsd 프록시 핸들러가 forwarded, x-forwarded-vdom 및 x-forwarded-cert 헤더를 명시적으로 설정함을 보여줌.
그리고 취약한 시스템에 SSH 로 연결하고 httpsd 프로세스에 대한 디버그 출력을 활성화한 다음 취약한 부분을 확인함.
< httpsd 프로세스에 대한 디버그 출력 활성화 >
전달된 헤더를 조사하는 동안 헤더를 구문 분석하고 for 및 by 필드를 추출하고 Apache request_rec 구조에 연결하는 Apache access_check_ex 후크를 찾음.
for 필드를 통해 요청 레코드의 연결에서 client_ip 필드를 설정할 수 있음을 알 수 있음.
< 전달된 헤더 구문 분석 >
또한, 특정 요청에 사용되는 핸들러를 언급하는 로그 메시지가 표시됨.
[httpsd 12478 - 1665412044 info]
fweb_debug_init[412] -- Handler "api_cmdb_v2-handler" assigned to
request |
핸들러 문자열을 검색한 후 init 바이너리에서 핸들러 배열을 찾음.
< 핸들러 배열 >
일부 핸들러를 조사한 후 많은 핸들러가 api_check_access 라는 함수를 호출함.
< api_check_access >
vdom 소켓 옵션이 신뢰할 수 있는지 확인하는 api_check_access_for_trusted_source 함수를 사용하지만 그 다음 is_trusted_ip_and_user_agent 함수로 넘어감.
이 함수는 client_ip 가 "127.0.0.1" 이고 User-Agent 헤더가 두 번째 매개변수와 일치하는 지 확인하는 것을 볼 수 있음.
"Node.js" 및 "Report Runner" 의 두 가지 가능한 매개변수로 호출됨.
"Node.js" 경로는 몇 가지 추가 유효성 검사를 수행하는 것으로 보이지만 "Report Runner" 를 사용하면 인증을 우회하고 API 요청을 수행할 수 있음.
< is_trusted_ip_and_user_agent >
결론적으로 취약점을 악용하기 위해서는 아래와 같이 요청의 필수 조건이 필요함.
1. Fowarded 헤더를 사용하여 공격자는 client_ip 를 "127.0.0.1" 로 설정해야 함.
2. "신뢰할 수 있는 액세스" 인증 검사는 client_ip 가 127.0.0.1" 이고 User-Agent 가 "Report Runner" 로 설정함.
위 조건으로 요청할 경우 시스템에 원하는 모든 작업을 수행할 수 있음.
네트워크 구성 변경, 새 사용자 추가, 패킷 캡처 등이 가능함.
현재 공개된 PoC 는 아래와 같으며 공격자가 원하는 SSH 키를 추가하여 SSH 서비스를 이용할 수 있음.
PUT /api/v2/cmdb/system/admin/admin HTTP/1.1 Host: xxx.xxx.xxx.xxx User-Agent: Report Runner Content-Type: application/json Forwarded:
for="[127.0.0.1]:8000";by="[127.0.0.1]:9000"; Content-Length: 612
{"ssh-public-key1": "\"ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABgQDIOC0lL4quBWMUAM9g/g9TSutzDupGQOnlYqfaNEIZqnSLJ3Mfln6rGSYol/WSm6/N7TNpuVFScRtmdUZ9O8oSamyaizqMG5hcRKRiI49F49judolcffBCTaVpQpxqt+tjcuGzZAoIqg6TyHg1BNoja/IjUQIVbNGyzl+DxmsX3mbmIwmffoyV8l4sEOynYqP3TC2Z8wJWv3WGudHMEDXBiyN3lrIDKlHzROWBkGQOcv3dCoYFTkzdKYPMtnTNdGOOF6wgWB3Y/fHyyWvbN23N2mxsgbRMdKTItJJNLGiJwYBHnC3lp2CQQlrYfsAnBQRu56gp7TPgheP+UYyGlYy4mcnsanGYCS4VozGfWwvhTSGEP5Uws/WxWNFq3Be7c/IWPx5AzvzT3iOq9R704xL1BxW9KAkPmjegav/jOEEh5YX7b+HcErMpTfo5DCi0CZilBUn9q/qM3v4HWKgJObaJnycE/PPyZML0xof29qvbXJDy2efYeCUCfxAIHUcJx58=
dev@devs-MacBook-Pro.local\""} |
( 3 ) 취약점 방어
1. 최신 패치로 업그레이드함.
- FortiOS 7.2.2 버전으로 업그레이드
- FortiOS 7.0.7 버전으로 업그레이드
- FortiProxy 7.2.1 버전으로 업그레이드
- FortiProxy 7.0.7 버전으로 업그레이드
- FortiSwitchManager 7.2.1 버전으로 업그레이드
- FG6000F, 7000E/F 시리즈 플랫폼일 경우 FortiOS 7.0.5 B8001 이상으로 업그레이드
2. 보안장비에 Snort 패턴을 등록하여 모니터링 및 대응함.
현재 공개된 PoC 를 토대로 HTTP 요청 시 "/api/v2/cmdb/system/admin/admin", "User-Agent: Report Runner", "127.0.0.1" 문자열이 포함된 경우 탐지하는 패턴을 등록함.
alert tcp any any -> any any (msg:"KOROMOON_Fortinet_Auth Bypass_Detected"; content:"/api/v2/cmdb/system/admin/admin"; content:"|20|HTTP/"; content:"|0d 0a|User-Agent|3a| Report Runner"; content:"127.0.0.1";)
댓글 없음:
댓글 쓰기