1. Cacti [1]

네트워크 및 시스템 성능을 모니터링하는 오픈 소스 도구
> SNMP를 기반으로 네트워크 장비, 서버, 애플리케이션 등의 성능 데이터를 수집하고, RRDTool을 사용하여 그래프 형태로 시각화

※ SNMP (Simple Network Management Protocol) : 네트워크 장비(라우터, 스위치, 서버 등)의 상태 및 성능 데이터를 수집하는 프로토콜
※ RRDTool : 시간에 따라 변화하는 데이터를 저장하고 그래프로 시각화해주는 툴

2. CVE-2025-22604

[사진 1] CVE-2025-22604 [2]

- Cacti의 다중 라인 SNMP 결과 파서의 결함으로 인해 발생하는 원격 코드 실행 취약점 (CVSS : 9.1) [3]

> OID의 일부가 시스템 명령의 일부로 사용되는 배열의 키로 사용되어 취약점이 발생

OID (Object IDentifier) [4] - SNMP는 네트워크 장비의 정보(CPU 사용량, 메모리 사용량, 포트 Up/Down 상태 등)을 MIB(Management Infomation Base)에 저장해 정보를 주고받음
-  MIB 내에 포함되어 있는 각 개별 정보(Object)에 대한 ID를 OID라 함
-  즉, CPU 사용량, 메모리 사용량, 포트 상태 등 각 정보에 대해 구분할 수 있는 ID
영향받는 버전 : Cacti <= 1.2.8

 

ss_net_snmp_disk_io() 또는 ss_net_snmp_disk_bytes()로 처리될 때 각 OID의 일부가 시스템 명령의 일부로 사용되는 배열의 키로 사용되어 취약점이 발생
> cacti_snmp_walk()에서 exec_into_array()를 사용해 명령을 실행하고 여러 줄을 배열로 사용해 결과를 읽음
> 그 후, [사진 2]의 코드를 사용해 문자 = 를 기준으로 왼쪽 값을 OID에, 오른쪽 값을 Value에 저장
> Value의 경우 필터링을 적용하지만, OID 값은 필터링 없이 사용

[사진 2] OID와 Value 분할 코드

$i=0;
foreach($temp_array as $index => $value) { // $temp_array 배열 순회
	if(preg_match('/(.*=.*/',$value)) { // $value 값이 "키=값" 형식인 경우
		$parts=explode('=',$value,2); // = 문자를 기준으로 $value를 두 부분으로 분할
		$snmp_array[$i]['oid']=trim($parts[0]); // 공백을 제거한 후 값을 oid에 저장
		$snmp_array[$i]['value']=format_snmp_string($parts[1],false,$value_output_format); // 필터링 후 value에 저장
		$i++; // 다음 배열 인덱스로 이동
	} else { // 멀티라인 값 처리
		$snmp_array[$i-1]['value'].=$value;
	}
}

3. 해결방안

- 벤더사 제공 보안 업데이트 제공

제품명 영향받는 버전 해결 버전
Cacti <= 1.2.8 1.2.29

4. 참고

[1] https://www.cacti.net/
[2] https://nvd.nist.gov/vuln/detail/CVE-2025-22604
[3] https://github.com/Cacti/cacti/security/advisories/GHSA-c5j8-jxj3-hh36
[4] https://blog.naver.com/watch_all/221698867095
[5] https://thehackernews.com/2025/01/critical-cacti-security-flaw-cve-2025.html

+ Recent posts