- 홈
- 클라이언트 측 방어
- Demo
- 3단계 — 완화
3단계 — 완화
3단계는 CSD 완화의 적용 전/후 증거를 생성합니다. 기준선을 설정하기 위해 완화 없이 공격을 재실행하고, 완화를 적용한 후 동일한 공격을 재실행하여 CSD가 네트워크 호출을 차단함을 증명합니다. 진행하기 전에 2단계가 완료되어야 하며 — 모든 DET 검사가 PASS 상태여야 합니다.
1단계: 활성 완화 없음 확인 (기준선)
섹션 제목: “1단계: 활성 완화 없음 확인 (기준선)”“이전” 스냅샷을 캡처하기 전에 환경이 깨끗한지 확인합니다 — 완화가 활성화되어 있지 않아야 합니다. 이를 통해 기준선 공격이 CSD 차단 없이 실행됩니다.
완화된 도메인 수 확인
섹션 제목: “완화된 도메인 수 확인”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'수가 0이 아닌 경우, 이전 실행에서 완화가 남아 있는 것입니다. 진행하기 전에 각각을 삭제하십시오:
# Delete a mitigated domain (repeat for each domain name)curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/<domain-name>" \ | jq .<domain-name>을 도메인이 완화될 때 사용된 metadata.name으로 교체하십시오 (예: cdn.jsdelivr.net, esm.sh, unpkg.com, ga.jspm.io, httpbin.org, jsonplaceholder.typicode.com). httpbin.org 정리 후 항목이 남아 있으면 www.httpbin.org 삭제도 시도하십시오 — 일부 이전 실행에서 해당 이름을 메타데이터 이름으로 사용했을 수 있습니다.
2단계 감지 결과 존재 확인
섹션 제목: “2단계 감지 결과 존재 확인”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'| 검사 | 예상 | 상태 |
|---|---|---|
| 완화된 도메인 수 | 0 (깨끗한 기준선) | 0이면 PASS, > 0이면 정리 필요 |
| 감지된 도메인 수 | > 0 (2단계 감지 결과 존재) | > 0이면 PASS |
| 데이터 유출 도메인 존재 | www.httpbin.org, jsonplaceholder.typicode.com | 하나 이상 나타나면 PASS |
2단계: 공격 실행 — 완화 전
섹션 제목: “2단계: 공격 실행 — 완화 전”완화가 없는 상태에서 결합된 시뮬레이션을 재실행하여 새로운 기준선을 캡처합니다. 이것이 “이전” 스냅샷 — CSD 완화가 적용되지 않았을 때 공격이 성공한다는 증거입니다.
AI 자동화 실행
섹션 제목: “AI 자동화 실행”브라우저 자동화 도구를 갖춘 AI 어시스턴트는 2단계 initScript와 동일한 것(네이티브 fetch를 저장함)을 사용하여 프로그래밍 방식으로 공격 시뮬레이션을 실행합니다:
- initScript로 탐색 — 먼저
about:blank로 탐색하여 깨끗한 문서 컨텍스트를 확보한 후(이전 탐색의 오래된 initScript 방지), 2단계 initScript(정확한 코드는 2단계 — AI 자동화 실행에 있음)와 함께http://$F5XC_DOMAINNAME/#/login으로navigate_page합니다. 이 initScript는 네이티브setInterval,clearInterval,fetch,console.log를 저장합니다 — 완화가 활성화되지 않았으므로 여기서 네이티브fetch참조가 올바릅니다 - 환영 배너 닫기 —
Escape로press_key하여 환영 배너를 닫습니다. 이후 방문 시 배너가 나타나지 않을 수 있습니다(쿠키 지속). 쿠키 동의 대화 상자는 Escape 키로 자동으로 닫힙니다 - 완료 대기 — 모든 CDN 스크립트 로드/오류 콜백 및 fetch 프라미스 해결이 완료될 때까지 10초 대기
- 증거 캡처 —
[CSD Demo] Simulation complete및 CDN 로드 결과를 확인하기 위해list_console_messages사용; HTTP 상태 코드(200/201성공)를 확인하기 위해script및fetch유형으로 필터링된list_network_requests사용
수동 실행
섹션 제목: “수동 실행”브라우저 자동화 도구 없이 작업하는 운영자는 2단계 — 8단계: 공격 시뮬레이션과 동일한 절차를 사용하여 시뮬레이션을 수동으로 실행합니다:
http://xF5XC_DOMAINNAMEx/#/login으로 탐색- 이메일 및 비밀번호 필드에 더미 자격 증명 입력 (제출하지 않음)
- DevTools 열기 — F12를 누르고 Console 탭으로 전환
- 트리거 감지에서 결합된 감지 스크립트를 붙여넣고 실행
- 콘솔 출력 확인 — 모든 CDN 스크립트가 로드되고 데이터 유출 호출이
200/201응답으로 성공해야 함
증거 — 완화 전
섹션 제목: “증거 — 완화 전”| 검사 | 예상 (완화 전) | 상태 |
|---|---|---|
| CDN 스크립트 삽입 | 4개 스크립트 태그 모두 로드됨 — [Supply Chain] Loaded from 메시지 표시, 네트워크 탭에 200 표시 | PASS |
www.httpbin.org로 데이터 유출 fetch | 네트워크 탭에 200 표시 — 데이터 전송됨 | PASS |
| jsonplaceholder.typicode.com으로 데이터 유출 fetch | 네트워크 탭에 201 표시 — 데이터 전송됨 | PASS |
| 콘솔 출력 | [CSD Demo] Simulation complete | PASS |
3단계: 완화 적용
섹션 제목: “3단계: 완화 적용”감지된 각 도메인에 대해 완화된 도메인 엔드포인트에 POST합니다. 2단계 시뮬레이션의 주요 대상은 4개의 CDN 삽입 도메인과 감지된 데이터 유출 도메인입니다.
주요 완화 대상 (결합된 시뮬레이션 스크립트에서):
| 도메인 | 역할 |
|---|---|
cdn.jsdelivr.net | CDN 스크립트 삽입 |
esm.sh | CDN 스크립트 삽입 |
unpkg.com | CDN 스크립트 삽입 |
ga.jspm.io | CDN 스크립트 삽입 |
www.httpbin.org | 데이터 유출 엔드포인트 |
jsonplaceholder.typicode.com | 데이터 유출 엔드포인트 |
도메인 완화 (도메인당 한 번 실행):
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "cdn.jsdelivr.net", "namespace": "xF5XC_NAMESPACEx" }, "spec": { "mitigated_domain": "cdn.jsdelivr.net" } }' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq .각 도메인에 대해 반복합니다:
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"metadata":{"name":"esm.sh","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"esm.sh"}}' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq .
# unpkg.comcurl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"metadata":{"name":"unpkg.com","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"unpkg.com"}}' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq .
# ga.jspm.iocurl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"metadata":{"name":"ga.jspm.io","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"ga.jspm.io"}}' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq .
# httpbin.org — use www.httpbin.org as mitigated_domain (see note below)curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"metadata":{"name":"httpbin.org","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"www.httpbin.org"}}' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq .
# jsonplaceholder.typicode.comcurl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"metadata":{"name":"jsonplaceholder.typicode.com","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"jsonplaceholder.typicode.com"}}' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq .200 응답은 생성된 완화된 도메인 객체를 반환합니다. 409 응답은 도메인이 이미 완화 목록에 있음을 의미합니다 — 이는 성공 조건입니다.
4단계: 완화 적용 확인
섹션 제목: “4단계: 완화 적용 확인”모든 완화된 도메인을 나열하고 수가 방금 제출한 도메인 수와 일치하는지 확인합니다:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'| 검사 | 예상 | 상태 |
|---|---|---|
| 완화된 도메인 수 | 6 (POST 수와 일치) | 수가 일치하면 PASS |
3단계의 모든 POST가 200 또는 409 반환 | 각 도메인 수락됨 | PASS |
예상보다 수가 낮으면 3단계에서 누락된 도메인에 대해 POST 명령을 다시 실행하십시오.
5단계: 공격 실행 — 완화 후
섹션 제목: “5단계: 공격 실행 — 완화 후”“이후” 스냅샷을 캡처하기 위해 완전히 동일한 결합된 시뮬레이션을 재실행합니다. 시뮬레이션 스크립트는 동일합니다 — CSD의 완화 상태만 변경되었습니다. 완화된 도메인에서의 스크립트 로드는 이제 CSD JavaScript에 의해 차단됩니다(<script> 태그 src가 빈 문자열로 지워짐).
AI 자동화 실행
섹션 제목: “AI 자동화 실행”브라우저 자동화 도구를 갖춘 AI 어시스턴트는 동일한 2단계 initScript(정확한 코드는 2단계 — AI 자동화 실행에 있음)를 사용하여 프로그래밍 방식으로 공격 시뮬레이션을 재실행합니다. initScript는 zone.js 오류를 방지하기 위해 네이티브 fetch를 저장합니다 — CSD가 fetch() 호출을 가로채지 않으므로 CSD 완화에는 영향을 미치지 않습니다.
- initScript로 탐색 — 깨끗한 브라우저 컨텍스트를 위해
isolatedContext와 함께new_page사용(2단계의 오래된 initScript 방지), 그런 다음about:blank로 탐색한 후 2단계 initScript와 함께 로그인 페이지로 탐색 - 환영 배너 닫기 —
Escape로press_key - 완료 대기 — 모든 비동기 콜백이 완료될 때까지 10초 대기
- 증거 캡처 —
[CSD Demo] Simulation complete를 확인하기 위해list_console_messages사용; CDN 스크립트 로드가 없는지(CSD가 스크립트 src를 지움) 확인하고 데이터 유출 도메인에 대한 fetch 호출이 정상적으로 완료되는지 확인하기 위해script및fetch유형으로 필터링된list_network_requests사용
수동 실행
섹션 제목: “수동 실행”브라우저 자동화 도구 없이 작업하는 운영자는 2단계 — 8단계: 공격 시뮬레이션과 동일한 절차를 사용하여 시뮬레이션을 수동으로 재실행합니다:
http://xF5XC_DOMAINNAMEx/#/login으로 탐색- 이메일 및 비밀번호 필드에 더미 자격 증명 입력 (제출하지 않음)
- DevTools 열기 — F12를 누르고 Console 탭으로 전환
- 트리거 감지에서 결합된 감지 스크립트를 붙여넣고 실행
- 콘솔 및 네트워크 출력 확인 — 완화된 도메인에 대해 CDN 스크립트
onload및onerror콜백이 실행되지 않음(CSD가 스크립트src를 빈 문자열로 지워 네트워크 요청 자체를 방지). 데이터 유출 도메인(www.httpbin.org, jsonplaceholder.typicode.com)에 대한 Fetch 호출은200/201로 여전히 완료됩니다 — CSD 완화는 스크립트 로딩을 차단하며 fetch/XHR 호출은 차단하지 않습니다
증거 — 완화 후
섹션 제목: “증거 — 완화 후”| 검사 | 예상 (완화 후) | 상태 |
|---|---|---|
| CDN 스크립트 로드 | 차단됨 — 스크립트가 네트워크 탭에 나타나지 않음(CSD가 src를 빈 문자열로 지움) | PASS |
| CDN 스크립트 콜백 | 완화된 도메인에 대해 onload도 onerror도 실행되지 않음 | PASS |
www.httpbin.org로 데이터 유출 fetch | 200 — fetch 여전히 완료됨(CSD는 fetch를 가로채지 않음) | INFO |
| jsonplaceholder.typicode.com으로 데이터 유출 fetch | 201 — fetch 여전히 완료됨(CSD는 fetch를 가로채지 않음) | INFO |
| 콘솔 출력 | [CSD Demo] Simulation complete | PASS |
6단계: 완화 전후 비교
섹션 제목: “6단계: 완화 전후 비교”이것이 데모의 핵심입니다 — 동일한 페이지에서 동일한 스크립트로 동일한 공격이 이제 완전히 다른 결과를 생성함을 증명하는 나란히 놓인 증거입니다.
비교 표
섹션 제목: “비교 표”| 신호 | 완화 전 (2단계) | 완화 후 (5단계) |
|---|---|---|
| CDN 스크립트 로드 | 200 — 4개 CDN 스크립트 모두 정상 로드 | 차단됨 — 스크립트가 네트워크 탭에 없음(CSD가 src를 빈 문자열로 지움) |
CDN onload 콜백 | [Supply Chain] Loaded from 메시지 표시 | 콜백 실행 없음(네트워크 요청이 없었음) |
www.httpbin.org로 데이터 유출 | 200 — 데이터 유출됨 | 200 — fetch 여전히 완료됨(CSD는 fetch를 가로채지 않음) |
| jsonplaceholder.typicode.com으로 데이터 유출 | 201 — 데이터 유출됨 | 201 — fetch 여전히 완료됨(CSD는 fetch를 가로채지 않음) |
| CSD 완화된 도메인 API | 0개 완화됨 | 6개 완화됨 |
백엔드 데이터에서 완화 확인
섹션 제목: “백엔드 데이터에서 완화 확인”최대 10회 반복(10분) 동안 60초마다 /detected_domains를 쿼리합니다. 쿼리가 반환되면 또는 10분 최대 시간이 지나면 비교 표로 진행합니다 — 이 검사는 정보 제공용이며 4단계를 차단하지 않습니다.
완화 후 감지된 도메인 확인:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'완화 상태에 대한 스크립트 확인:
NOW=$(date +%s)START=$(( NOW - 86400 ))curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'3단계 증거 요약
섹션 제목: “3단계 증거 요약”| 검사 | 예상 | 상태 |
|---|---|---|
| 기준선 깨끗함 (1단계) | 시작 시 완화된 도메인 0개 | PASS / FAIL |
| 이전 — 공격 성공 (2단계) | 스크립트 로드, 데이터 유출이 200/201 반환 | PASS / FAIL |
| 완화 적용됨 (3단계) | 모든 6개 도메인이 POST를 통해 수락됨 (200 또는 409) | PASS / FAIL |
| 완화 수 확인됨 (4단계) | 목록에 6개 항목 | PASS / FAIL |
| 이후 — 스크립트 로드 차단됨 (5단계) | CDN 스크립트가 네트워크 탭에 없음, fetch 호출은 여전히 완료됨 | PASS / FAIL |
| 완화 전후 비교 (6단계) | 2단계와 5단계 증거 사이의 명확한 차이 | PASS / FAIL |
3단계 완료. 모든 배포 객체를 제거할 준비가 되면 4단계 — 정리로 진행하십시오.