
pfSense CE 2.9.0-DEVELOPMENT - 높음 - 원격 - RCE - QinQ parent-if ifconfig
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-qinq-parent-if
Class: RCE Reach: Remote
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
QinQ 편집은 does_interface_exist 검사 없이 부모 인터페이스 이름을 저장합니다. VLAN 편집은 이미 실제 인터페이스가 아닌 부모를 거부합니다. Form_Select는 POST를 재검증하지 않습니다. interface_qinq_configure가 조기 반환되더라도 write_config를 생성합니다. 이후 멤버 추가/제거 시 저장된 vlanif가 이스케이프되지 않은 ifconfig에 삽입됩니다. PHP exec는 /bin/sh -c입니다. WebGUI PHP-FPM은 root입니다. 권한은 Diagnostics: Command가 아닌 page-interfaces-qinq-edit입니다.
| ID | 아직 CVE 없음 |
| Class | RCE |
| Reach | Remote (인증된 WebGUI) |
| CWE | CWE-78 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Product | pfSense CE |
| Affected | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) QinQ 편집 |
| Auth | page-interfaces-qinq-edit 권한이 있는 WebGUI 세션 |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 전용 |
저는 공개 master 9363ac5를 고정했습니다. 랩은 고정된 vlan_interface / interface_qinq_configure / 멤버 exec 라인의 PHP 가젯이며, 127.0.0.1:18810에서 루프백 HTTP를 사용합니다.
| Method | Sink | Privilege |
|---|---|---|
| 실제 인터페이스가 아닌 부모로 QinQ 생성 POST, 이후 멤버를 추가하는 편집 POST | interface_qinq2_configure exec ifconfig vlan create ... (interfaces.inc:620) | Integrity (lab-proven): /bin/sh -c를 통한 root 셸. Lab: 멤버 추가 qinq2가 witness를 기록함(member-sink=yes). |
동일하게 저장된 vlanif, 멤버를 제거하는 편집 POST | exec("/sbin/ifconfig {$parent}.{$tag} destroy") (interfaces_qinq_edit.php:212) | Integrity (lab-proven): 동일한 root exec. Destroy에는 IF_NAMESIZE 제한이 없음. |
| 동일한 root 셸 | 호스트 파일시스템 | Recon (inferred): config.xml, 키, 다른 테넌트. 이 페이지는 exec 출력을 표시하지 않음. |
Root 셸 또는 손상된 ifconfig | vlan 장치 | Availability (inferred): vlan 장치 생성/파괴; 데이터 플레인이 영향을 받음. |
Lab-proven vs inferred: VLAN 거부, 생성 전용 no exec, 길이 16에서의 IF_NAMESIZE 차단, 멤버 추가 qinq2 witness는 lab-proven입니다. 파일시스템 정찰과 데이터 플레인 중단은 root PHP-FPM에서 추론한 것입니다.
Requires: page-interfaces-qinq-edit 권한이 있는 WebGUI 세션. CSRF 토큰. 두 번의 POST(생성, 이후 멤버 편집). 기본 admin은 해당 페이지를 가집니다. 제한된 사용자에게 이 페이지만 부여할 수 있습니다.
| Surface | Lab |
|---|---|
| VLAN 부모 존재 검사 | vlan-rejected=yes |
| QinQ 생성 전용 (부모 없음) | config 저장, create-no-exec=yes |
| qinq2 이름 길이 16 | exec 전 if-namesize-block=yes |
| 토큰 없는 Unauth / CSRF | guiconfig + CSRF-magic |
GIF/GRE 이름 정규식, LAGG 멤버 does_interface_exist + escapeshellarg | 다른 페이지 |
| 한 번도 생성되지 않은 부모의 QinQ 목록 삭제 | does_interface_exist($vlanif) |
| Diagnostics: Command | 함께 부여되지 않는 한 닫혀 있음 |
Diagnostics: Command 없음. Unauth 없음. 역사적 클래스는 CVE-2023-42326 GIF/GRE이며, 다른 페이지입니다.
cd lab
./run.sh
루프백 127.0.0.1:18810. Compose 프로젝트 pfsense-qinq-parent-if. 이미지 태그 pfsense-qinq-parent-if:2.9.0-dev. Witness PFSENSE-QINQ-PARENT-IF-WITNESS. 마지막 줄:
SUCCESS PFSENSE-QINQ-PARENT-IF vlan-rejected=yes create-no-exec=yes member-sink=yes if-namesize-block=yes PFSENSE-QINQ-PARENT-IF-WITNESS
QinQ 편집: VLAN 편집과 동일하게 실제 인터페이스가 아닌 부모를 거부합니다. 멤버 태그에 대한 정수 검사는 이미 존재하지만, 모든 ifconfig 전에 저장된 vlanif를 여전히 escapeshellarg해야 합니다. 멤버 삭제 destroy는 interface_qinq2_configure가 IF_NAMESIZE를 제한하는 것과 동일한 방식으로 제한해야 합니다.
9363ac5b8651a1c7a333180425ce7719070f95f9interfaces_qinq_edit.phpinterfaces.inc interface_qinq2_configureinterfaces_vlan_edit.php