
OPNsense 26.7.6 - 높음 - 원격 - 권한 잔존 - 커스텀 펌웨어 미러가 pkg 지문을 sed로 건너뜀
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-firmware-mirror-sed
분류: 서명 건너뛰기 도달 범위: 원격
OPNsense 코어 26.7.6 (a842fe48) - opnsense.org
시스템: 펌웨어 set이 사용자 지정 mirror / flavour를 POST합니다. 코어 FILTER_SANITIZE_URL은 \|#;"를 유지합니다. opnsense-update -m / -n은 해당 문자열을 OPNsense.conf에 대한 sed로 보간하며, signature_type을 "fingerprints"에서 "none"으로 뒤집을 수 있습니다. 그런 다음 공격자 URL에서 root 권한으로 pkg install이 실행됩니다. 설정 페이지는 여전히 서명된 OPNsense 패키지의 사용자 지정 미러를 제공합니다. "서명 비활성화" 제어는 없습니다. 권한은 page-all이 아닌 page-system-firmware-manualupdate입니다.
Sed는 핀 외부의 opnsense-update에 있습니다. 이 핀의 코어는 정제되지 않은 필드와 -m 패스입니다. 랩은 해당 s||| 프로그램 텍스트를 GNU sed로 다시 실행합니다.
이 GitHub 팩은 조정된 공개까지 비공개로 유지됩니다.
| ID | 아직 CVE 없음 |
| 분류 | 서명 건너뛰기 |
| 도달 범위 | 원격 (인증된 WebGUI / API) |
| CWE | CWE-74 / CWE-347 |
| CVSS | 높음: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| 제품 | OPNsense core |
| 영향받음 | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) 펌웨어 set 사용자 지정 미러 |
| 인증 | page-system-firmware-manualupdate 권한이 있는 WebGUI 세션 또는 API 키 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
저는 태그 26.7.6 peel a842fe48을 고정했습니다. 랩은 FILTER_SANITIZE_URL과 opnsense-update mod_mirrorurl sed의 PHP 가젯이며, 127.0.0.1:18860에서 루프백 HTTP를 사용합니다. PR:H인 이유는 펌웨어 페이지가 이미 서명된 패키지를 설치할 수 있도록 허용되어 있기 때문입니다. 해당 페이지를 PR:L로 취급하면 점수는 8.8입니다.
| 방법 | 싱크 | 권한 |
|---|---|---|
|가 포함된 사용자 지정 미러에 대한 FILTER_SANITIZE_URL 후 opnsense-update 스타일 sed | OPNsense.conf 재작성 | 무결성 (랩 입증): signature_type "none". 대조 미러는 "fingerprints"로 유지됨. 랩: sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes. |
| 동일한 set, plugins 필드 | setAction이 plugins를 버림 | 부정 (랩 입증): plugins는 저장 전에 버려짐. |
그런 다음 POST /api/core/firmware/install/<pkg> | 공격자 URL에서 root 권한으로 pkg install -y | 무결성 (추론): 서명되지 않은 패키지를 root로 설치. 펌웨어 페이지는 이미 서명된 패키지를 설치하며, 이 잔여물이 검증 건너뛰기임. 랩에는 서명되지 않은 페이로드 없음. |
그런 다음 POST /api/core/firmware/update 또는 /upgrade | root 권한으로 opnsense-update -pt / -u | 무결성 (추론): 검증이 건너뛰어진(DO_INSECURE) base/kernel 세트. |
GET /api/core/firmware/info, /running, /upgradestatus | 펌웨어 API | 정찰 (추론): 패키지 목록, 업데이트 로그, 미러 옵션. 이 ACL에 의도된 기능. |
POST /api/core/firmware/reboot, /poweroff, /remove/<pkg> | configd 펌웨어 작업 | 가용성 (추론): 재부팅/정지/제거. 이 ACL에 의도된 기능이며, 잔여물이 아님. |
랩 입증 vs 추론: sanitize가 |를 유지하고 signature_type이 none인 것은 랩 SUCCESS입니다. 서명되지 않은 패키지의 실제 pkg install은 추론입니다. 가젯이며, 완전한 OPNsense FreeBSD VM이 아닙니다. 서명되지 않은 패키지 페이로드는 없습니다.
요구 사항: page-system-firmware-manualupdate 권한이 있고 page-all이 없는 로그인 사용자 또는 해당 사용자의 Local API 키. 세션 POST에 대한 CSRF. 인증 없이는 불가. 대시보드 전용도 불가.
| 표면 | 랩 |
|---|---|
| 인증 없는 펌웨어 | 401 |
| 대시보드 전용 | 403 |
대조 미러 https://pkg.opnsense.org | signature_type이 "fingerprints"로 유지됨 |
| 플러그인 이름 트래버설 | filter_pkgname |
| 변경 로그 가져오기 | 여전히 opnsense-verify |
save()에 대한 user-config-readonly | throwReadOnly() |
| 검증 건너뛰기 없는 기본 HTTP 미러 | 전송 MITM; fingerprints는 여전히 필요 |
| XMLRPC 펌웨어 | 버전 문자열만 |
인증 없이는 불가. 대시보드 전용도 불가. 변경 로그는 여전히 서명됨.
cd lab
./run.sh
루프백 127.0.0.1:18860. Compose 프로젝트 opnsense-firmware-mirror-sed. Witness OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS. 마지막 줄:
SUCCESS opnsense-firmware-mirror-sed sanitize-keeps-pipe=yes signature_type=none fingerprints-control=yes OPNSENSE-FIRMWARE-MIRROR-SED-WITNESS
루트 런처: python3 opnsense-firmware-mirror-sed-Abraxas-Labs.py.
랩에서 사용된 공격 미러 형태 (witness 전용, 서명되지 않은 pkg 없음):
https://example.invalid/|;/signature_type/s/"fingerprints"/"none"/;#
URL이 아닌 사용자 지정 미러를 거부하십시오. opnsense-update -m / -n 전에 sed 메타문자(|, ;, #, ")를 제거하거나, URL을 파일로 전달하여 sed가 이를 프로그램 텍스트로 보지 않도록 하십시오. 별도의 감사된 제어가 검증을 끄지 않는 한 signature_type: "fingerprints"를 유지하십시오. 펌웨어 set이 fingerprints를 "none"으로 재작성하도록 허용하지 마십시오.
a842fe48c21288d11a422cb944678e8eb308becfFirmwareController.php setAction FILTER_SANITIZE_URLscripts/firmware/repos/OPNsense.php opnsense-update -sd -mOPNsense.conf.shadow.in 기본 signature_type: "fingerprints"opnsense-update mod_mirrorurl (url: 줄에 대한 s\|\|)