coldframe
슈퍼마켓 냉장 설비 컨트롤러를 위한 허니팟입니다.
2026년, 공격자들은 기본 비밀번호와 오래되고 패치되지 않은 펌웨어(firmware)를 사용하여 유럽 전역의 인터넷에 연결된 냉장 감독 시스템(refrigeration supervisors)을 해킹한 후, 강제 제상 사이클(forced defrost cycles)을 실행했습니다. coldframe은 이러한 컨트롤러 중 하나인 척합니다. 이 시스템은 누가 접속하는지, 어떤 비밀번호를 시도하는지, 그리고 어떤 공개 익스플로잇(public exploits)을 사용하는지를 기록하지만, 실제로는 아무것도 제공하지 않습니다.
이것은 표준 라이브러리 외에 의존성이 없는 단일 Python 파일입니다.
페르소나 (Personas)
| 페르소나 | ~인 척함 | 제공하는 기능/서비스 |
|---|
danfoss | Danfoss AK-SM 800A 시스템 매니저 | StoreView 로그인, 가짜 스토어 대시보드, /html/xml.cgi 및 /xml.cgi의 XML API, HTTP 및 HTTPS |
dixell | Copeland/Dixell XWEB EVO 슈퍼바이저 | 로그인 페이지와 공개 익스플로잇이 목표하는 XWEB 500 CGI 경로 |
실제 장치처럼 보이게 하기 (Looking like a real unit)
Danfoss 페르소나는 실제 AK-SM 800A 장치가 인터넷 스캐너에 기록되는 내용을 복사합니다: nginx 서버 헤더와 헤더 순서, Danfoss StoreView 페이지 제목, TLS 1.2만 지원, 그리고 CN=DanfossSM800A를 위한 1년 인증서가 SelfSigned-DanfossSM800A 권한에 의해 발급됩니다. 각 빌드는 자체 키를 생성합니다.
약한 로그인(예: Supervisor / 12345)과 정확한 CVE-2025-41450 “오늘의 코드”는 성공합니다. 공격자는 세션 토큰과 제상 버튼이 있는 가짜 냉장 케이스 대시보드를 얻습니다. 그들이 취하는 모든 행동은 control 이벤트로 기록되며, 실제로는 아무것도 없습니다.
Dixell 페르소나는 동일한 방식으로 실제 XWEB EVO 장치를 따릅니다: Server 헤더 없음, 보안 헤더(security-header) 설정 및 순서, 동일한 자산 경로와 페이지 크기. 로그인 과정은 실제 /cgi-bin/login.lua 흐름을 사용합니다: 문서화된 공장 초기 로그인인 Admin / Admin이 성공하며, 5분 동안 5회 실패 시 사용자 계정이 잠기고, XWEB Pro의 auth_mode 우회 시도(CVE-2026-25085)는 태그가 지정됩니다.
두 공급업체의 실제 장치 모두 자체 파비콘(favicon)을 제공하며, 스캐너는 이 해시 값으로 장치를 일치시킵니다. 해당 아이콘은 공급업체의 아트워크이므로 이 저장소에는 포함되어 있지 않습니다. 사설 배포의 경우, 사용 권한이 있는 복사본을 FAVICON_FILE에 지정할 수 있습니다.
Danfoss 시작 페이지도 마찬가지입니다. 실제 장치는 펌웨어에서 짧은 Angular 로더 페이지를 제공하며, 수천 개가 정확히 동일한 해시 값을 공유합니다. INDEX_FILE을 해당 index.html(공개 펌웨어 패키지에서 가져옴)에 지정하면, 미끼(decoy)는 이를 바이트 단위로 서비스하며, Last-Modified 및 ETag에 원래 날짜를 포함합니다. 이후 로더의 main.*.js가 미끼 자체의 로그인 페이지를 표시하는데, 이는 펌웨어의 원격 로그인과 유사하게 배치됩니다. 만약 펌웨어의 assets/images/Danfoss-logo.png가 해당 index.html 옆에 있다면, 페이지는 이를 사용합니다.
두 페르소나 모두 가짜 케이스 온도, 설정값(setpoints), 그리고 제상 레지스터를 갖춘 선택적 Modbus TCP 서비스를 실행할 수도 있습니다. 실제 AK-SM 800A 장치는 자체 케이스 컨트롤러와 통신하기 위해 Modbus만을 사용하므로, 기본적으로 Modbus는 비활성화되어 있습니다. 일반적인 산업용 스캐너를 포착하려면 이를 활성화하십시오.
인식하는 익스플로잇 (Exploits)
공개된 익스플로잇과 일치하는 요청은 로그에 exploit 필드를 얻습니다:
- CVE-2023-25914: AK-SM 800A의
get_file을 통한 경로 탐색(path traversal)
- CVE-2023-25915: AK-SM 800A의
load_cert을 통한 명령어 주입(command injection)
- CVE-2025-41452: AK-SM 800A의
load_nginx_headers를 통한 nginx 헤더 덮어쓰기
- CVE-2025-41450: AK-SM 800A '오늘의 코드' 로그인 우회 (
eds_only 또는 quantum_only를 사용한 getauth), 공격자가 올바른 코드를 계산했는지 여부 기록
- SM800 오늘의 코드 우회: 다른 명령어에 대한
eds_only / quantum_only 적용
- CVE-2021-45420: XWEB 500의
/cgi-bin/ 아래 업로드 및 명령어 경로
- CVE-2026-25085: 예상치 못한
auth_mode를 통한 XWEB Pro 로그인 우회
빠른 시작 (Quick start)
PERSONA=danfoss HTTP_PORT=8080 python3 -I honeypot.py
http://localhost:8080을 열면 모든 요청이 표준 출력(stdout)과 events.jsonl에 JSON 라인으로 표시됩니다.
테스트 실행하기 (테스트가 루프백에서 허니팟을 시작하고 공격합니다):
python3 -I test_honeypot.py
배포하기 (Deploying)
가장 빠른 방법: "사용자 데이터(User data)"에 붙여넣기
Ubuntu 24.04 서버를 생성하고 cloud-init.yaml 파일을 사용자 데이터(User data) 상자에 붙여넣으세요. XWEB 페르소나를 원한다면 PERSONA=danfoss를 dixell로 변경하세요. 부팅 후 약 2분 뒤에 미끼가 포트 80 (Danfoss의 경우 443)에서 리스닝하며, 아래와 같이 강화(hardened)되어 있습니다.
그런 다음, 제공업체의 방화벽에서 어디서든 미끼의 포트만 허용하고 SSH는 본인의 주소에서만 접근 가능하도록 설정하세요. 다음 명령어로 로그를 확인합니다:
ssh root@<server> 'podman logs coldframe'
수동으로 진행하기 (By hand)
컨테이너를 빌드하세요. 빌드를 할 때마다 새로운 자체 서명 인증서(self-signed certificate)가 생성되므로, 두 번 배포해도 인증서를 공유하지 않습니다.
podman build -t coldframe .
rootful podman 또는 Docker를 사용하여 실행하세요. Rootless 포트 포워딩은 소스 주소를 재작성하여 모든 공격자가 동일한 내부 IP처럼 보이게 만듭니다.
--userns=auto는 컨테이너를 사용하지 않는 호스트 UID 범위에 매핑하므로, 컨테이너 사용자조차도 호스트에서는 아무도 아닌(nobody) 상태가 됩니다. Podman은 호스트당 한 번씩 할당할 범위를 필요로 합니다:
echo "containers:2147483647:2147483648" | sudo tee -a /etc/subuid /etc/subgid
sudo podman run -d --name coldframe --restart=always \
--read-only --cap-drop=ALL --security-opt no-new-privileges --userns=auto \
--memory 128m --pids-limit 512 --log-opt max-size=10m \
...
Modbus의 경우, -e MODBUS_PORT=5020 -p 502:5020을 추가하세요.
호스트에서는 페르소나가 실제로 가질 포트만 노출하고, DNS와 패키지 업데이트를 제외한 아웃바운드 트래픽은 차단하세요. 미끼는 외부로 연결할 필요가 없습니다. SSH 접근은 오직 본인의 주소에서만 가능하도록 유지하세요. 전 세계에 SSH가 열린 냉장고 컨트롤러는 이상해 보입니다.
설정 (Configuration)
| 변수(Variable) | 기본값(Default) | 의미(Meaning) |
|---|
PERSONA | danfoss | danfoss 또는 dixell |
| ... | | |
로그 읽기 (Reading the log)
각 줄은 하나의 이벤트입니다:
{"ts": "2026-11-05T10:57:21.158+00:00", "persona": "danfoss", "proto": "http",
"src_ip": "203.0.113.7", "src_port": 6782, "event": "login_attempt",
"username": "admin", "password": "admin"}
event | When |
|---|
request | Any HTTP(S) request, with method, path, Host, User-Agent, Authorization and body |
| ... | |
summary.py는 로그를 짧은 보고서로 변환합니다:
python3 -I summary.py --hours 24 --ignore <your-own-ip> < events.jsonl
안전성 (Safety)
- 명령어를 실행하거나, 파일을 읽거나, 트래픽을 전달하지 않습니다. 익스플로잇 페이로드(Exploit payloads)는 기록되고 폐기됩니다.
- 요청 본문(Request bodies), 기록된 필드 및 연결은 소스별 제한을 포함하여 제한되며, 단일 공격자가 다른 사용자의 로그를 가득 채우지 못하도록 합니다. 유휴 소켓은 시간 초과되며, 이벤트 로그는 용량이 커지면 순환됩니다.
- 데이터가 조금씩 흘러나오게 하여 연결을 유지하는 경우는 30초 후에 끊어지고, 거부된 연결은 기록됩니다.
- 너무 긴 로그 라인은 잘리고,
summary.py는 공격자 입력으로부터 터미널 이스케이프 코드(terminal escape codes)를 무력화합니다.
- 컨테이너는 자체 사용자 네임스페이스에서 비루트(non-root) 사용자로, 권한이 없는 읽기 전용 파일 시스템에서 실행됩니다.
- 로그 필드는 공격자가 제어할 수 있습니다. 이를 보거나 처리할 때는 신뢰하지 않는 정보로 취급하십시오.
제한 사항 (Limitations)
- 얕은 상호작용(Shallow interaction). 로그인한 공격자는 전체 StoreView 앱이 아닌 작은 대시보드와 소수의 XML 명령만 볼 수 있습니다.
- 공개 코드는 지문 인식이 가능합니다(fingerprinted). 누구나 이 저장소를 읽고 정확한 응답을 파악할 수 있습니다. 배포 시 페르소나 문자열(persona strings), 페이지 레이아웃 및 인증서 주체(certificate subject)를 변경하십시오.
- 확인되지 않은 세부 정보. 정적 경로, 전체 웹 앱 및 실제 장치의 일부 XML 응답 형태는 공개되어 있지 않습니다. 누락된 부분에 대해서는 coldframe이 그럴듯한 값(plausible values)을 사용합니다.
- 클라우드 IP는 의심스럽게 보입니다. 일부 스캐너는 클라우드 호스팅의 산업용 장치를 잠재적인 허니팟으로 플래그 지정합니다.
출처 (Sources)
• Danfoss AK-SM 800A 사용자 가이드 (포트 테이블, 로그인 화면, StoreView Web): https://assets.danfoss.com/documents/latest/590332/BC337629891709en-001101.pdf
• Danfoss AK-SM XML 인터페이스 가이드: https://assets.danfoss.com/documents/latest/376199/AU342138209420en-000501.pdf
• Synacktiv, AK-SM 800A 취약점 (CVE-2023-25914, CVE-2023-25915): https://www.synacktiv.com/sites/default/files/2023-10/synacktiv-danfoss-sm800a-multiple-vulnerabilities.pdf
• Synacktiv, SM800 인증 우회 (auth bypass): https://www.synacktiv.com/sites/default/files/2023-10/synacktiv-danfoss-sm800-sc255-sc355-auth-bypass.pdf
• Claroty Team82, Danfoss 컨트롤러 연구 (CVE-2025-41450 ~ 41452): https://blog.claroty.com/team82/research/freeze-the-controller-defrost-the-food-uncovering-vulnerabilities-in-danfoss-refrigeration-controllers
• Exploit-DB 50639, XWEB 500 (CVE-2021-45420): https://www.exploit-db.com/exploits/50639
• Copeland XWEB EVO 작동 매뉴얼 r5.4.1 (기본 로그인, 잠금 기능): https://webapps.copeland.com/Dixell/Content/Pages/Manuals/XWEBEVO/XWEBEVOV5.4.1OPERATION/XWEB-EVO-r5.4.1-OPR-EN.pdf
• CISA ICSA-26-057-10 및 Claroty Team82, XWEB Pro 취약점: https://claroty.com/team82/research/chilling-discoveries-unpacking-vulnerabilities-in-copeland-xweb-pro-controllers
• Ironhackers, CVE-2025-41450 코드 오브 더 데이 분석: https://ironhackers.es/en/danfoss-ak-sm-800a-cve-2025-41450/
• 노출된 장치에 대한 Shodan 기록 (헤더 설정, 제목, 인증서 필드), 2026년 11월
관련 연구
eppser/danfoss-ak-sm-decoy는 SNMP 및 Service Tool 리스너와 더 풍부한 시뮬레이션 스토어를 갖춘 또 다른 AK-SM 디코이(decoy)입니다. coldframe은 실제 장치의 웹 지문(web fingerprints) 일치, 특정 익스플로잇 탐지, 그리고 Dixell XWEB 지원에 중점을 둡니다.
라이선스
MIT. LICENSE 참조.