콘텐츠로 이동

3단계 — 완화

3단계는 CSD 완화의 적용 전/후 증거를 생성합니다. 기준선을 설정하기 위해 완화 없이 공격을 재실행하고, 완화를 적용한 후 동일한 공격을 재실행하여 CSD가 네트워크 호출을 차단함을 증명합니다. 진행하기 전에 2단계가 완료되어야 하며 — 모든 DET 검사가 PASS 상태여야 합니다.

1단계: 활성 완화 없음 확인 (기준선)

섹션 제목: “1단계: 활성 완화 없음 확인 (기준선)”

“이전” 스냅샷을 캡처하기 전에 환경이 깨끗한지 확인합니다 — 완화가 활성화되어 있지 않아야 합니다. 이를 통해 기준선 공격이 CSD 차단 없이 실행됩니다.

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'

수가 0아닌 경우, 이전 실행에서 완화가 남아 있는 것입니다. 진행하기 전에 각각을 삭제하십시오:

Terminal window
# 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 삭제도 시도하십시오 — 일부 이전 실행에서 해당 이름을 메타데이터 이름으로 사용했을 수 있습니다.

Terminal window
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

완화가 없는 상태에서 결합된 시뮬레이션을 재실행하여 새로운 기준선을 캡처합니다. 이것이 “이전” 스냅샷 — CSD 완화가 적용되지 않았을 때 공격이 성공한다는 증거입니다.

브라우저 자동화 도구를 갖춘 AI 어시스턴트는 2단계 initScript와 동일한 것(네이티브 fetch를 저장함)을 사용하여 프로그래밍 방식으로 공격 시뮬레이션을 실행합니다:

  1. initScript로 탐색 — 먼저 about:blank로 탐색하여 깨끗한 문서 컨텍스트를 확보한 후(이전 탐색의 오래된 initScript 방지), 2단계 initScript(정확한 코드는 2단계 — AI 자동화 실행에 있음)와 함께 http://$F5XC_DOMAINNAME/#/login으로 navigate_page합니다. 이 initScript는 네이티브 setInterval, clearInterval, fetch, console.log를 저장합니다 — 완화가 활성화되지 않았으므로 여기서 네이티브 fetch 참조가 올바릅니다
  2. 환영 배너 닫기Escapepress_key하여 환영 배너를 닫습니다. 이후 방문 시 배너가 나타나지 않을 수 있습니다(쿠키 지속). 쿠키 동의 대화 상자는 Escape 키로 자동으로 닫힙니다
  3. 완료 대기 — 모든 CDN 스크립트 로드/오류 콜백 및 fetch 프라미스 해결이 완료될 때까지 10초 대기
  4. 증거 캡처[CSD Demo] Simulation complete 및 CDN 로드 결과를 확인하기 위해 list_console_messages 사용; HTTP 상태 코드(200/201 성공)를 확인하기 위해 scriptfetch 유형으로 필터링된 list_network_requests 사용

브라우저 자동화 도구 없이 작업하는 운영자는 2단계 — 8단계: 공격 시뮬레이션과 동일한 절차를 사용하여 시뮬레이션을 수동으로 실행합니다:

  1. http://xF5XC_DOMAINNAMEx/#/login으로 탐색
  2. 이메일 및 비밀번호 필드에 더미 자격 증명 입력 (제출하지 않음)
  3. DevTools 열기 — F12를 누르고 Console 탭으로 전환
  4. 트리거 감지에서 결합된 감지 스크립트를 붙여넣고 실행
  5. 콘솔 출력 확인 — 모든 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 completePASS

감지된 각 도메인에 대해 완화된 도메인 엔드포인트에 POST합니다. 2단계 시뮬레이션의 주요 대상은 4개의 CDN 삽입 도메인과 감지된 데이터 유출 도메인입니다.

주요 완화 대상 (결합된 시뮬레이션 스크립트에서):

도메인역할
cdn.jsdelivr.netCDN 스크립트 삽입
esm.shCDN 스크립트 삽입
unpkg.comCDN 스크립트 삽입
ga.jspm.ioCDN 스크립트 삽입
www.httpbin.org데이터 유출 엔드포인트
jsonplaceholder.typicode.com데이터 유출 엔드포인트

도메인 완화 (도메인당 한 번 실행):

Terminal window
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 .

각 도메인에 대해 반복합니다:

esm.sh
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.com
curl -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.io
curl -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.com
curl -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 응답은 도메인이 이미 완화 목록에 있음을 의미합니다 — 이는 성공 조건입니다.

모든 완화된 도메인을 나열하고 수가 방금 제출한 도메인 수와 일치하는지 확인합니다:

Terminal window
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 명령을 다시 실행하십시오.

“이후” 스냅샷을 캡처하기 위해 완전히 동일한 결합된 시뮬레이션을 재실행합니다. 시뮬레이션 스크립트는 동일합니다 — CSD의 완화 상태만 변경되었습니다. 완화된 도메인에서의 스크립트 로드는 이제 CSD JavaScript에 의해 차단됩니다(&lt;script&gt; 태그 src가 빈 문자열로 지워짐).

브라우저 자동화 도구를 갖춘 AI 어시스턴트는 동일한 2단계 initScript(정확한 코드는 2단계 — AI 자동화 실행에 있음)를 사용하여 프로그래밍 방식으로 공격 시뮬레이션을 재실행합니다. initScript는 zone.js 오류를 방지하기 위해 네이티브 fetch를 저장합니다 — CSD가 fetch() 호출을 가로채지 않으므로 CSD 완화에는 영향을 미치지 않습니다.

  1. initScript로 탐색 — 깨끗한 브라우저 컨텍스트를 위해 isolatedContext와 함께 new_page 사용(2단계의 오래된 initScript 방지), 그런 다음 about:blank로 탐색한 후 2단계 initScript와 함께 로그인 페이지로 탐색
  2. 환영 배너 닫기Escapepress_key
  3. 완료 대기 — 모든 비동기 콜백이 완료될 때까지 10초 대기
  4. 증거 캡처[CSD Demo] Simulation complete를 확인하기 위해 list_console_messages 사용; CDN 스크립트 로드가 없는지(CSD가 스크립트 src를 지움) 확인하고 데이터 유출 도메인에 대한 fetch 호출이 정상적으로 완료되는지 확인하기 위해 scriptfetch 유형으로 필터링된 list_network_requests 사용

브라우저 자동화 도구 없이 작업하는 운영자는 2단계 — 8단계: 공격 시뮬레이션과 동일한 절차를 사용하여 시뮬레이션을 수동으로 재실행합니다:

  1. http://xF5XC_DOMAINNAMEx/#/login으로 탐색
  2. 이메일 및 비밀번호 필드에 더미 자격 증명 입력 (제출하지 않음)
  3. DevTools 열기 — F12를 누르고 Console 탭으로 전환
  4. 트리거 감지에서 결합된 감지 스크립트를 붙여넣고 실행
  5. 콘솔 및 네트워크 출력 확인 — 완화된 도메인에 대해 CDN 스크립트 onloadonerror 콜백이 실행되지 않음(CSD가 스크립트 src를 빈 문자열로 지워 네트워크 요청 자체를 방지). 데이터 유출 도메인(www.httpbin.org, jsonplaceholder.typicode.com)에 대한 Fetch 호출은 200/201여전히 완료됩니다 — CSD 완화는 스크립트 로딩을 차단하며 fetch/XHR 호출은 차단하지 않습니다
검사예상 (완화 후)상태
CDN 스크립트 로드차단됨 — 스크립트가 네트워크 탭에 나타나지 않음(CSD가 src를 빈 문자열로 지움)PASS
CDN 스크립트 콜백완화된 도메인에 대해 onloadonerror도 실행되지 않음PASS
www.httpbin.org로 데이터 유출 fetch200 — fetch 여전히 완료됨(CSD는 fetch를 가로채지 않음)INFO
jsonplaceholder.typicode.com으로 데이터 유출 fetch201 — fetch 여전히 완료됨(CSD는 fetch를 가로채지 않음)INFO
콘솔 출력[CSD Demo] Simulation completePASS

이것이 데모의 핵심입니다 — 동일한 페이지에서 동일한 스크립트로 동일한 공격이 이제 완전히 다른 결과를 생성함을 증명하는 나란히 놓인 증거입니다.

신호완화 전 (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 완화된 도메인 API0개 완화됨6개 완화됨

최대 10회 반복(10분) 동안 60초마다 /detected_domains를 쿼리합니다. 쿼리가 반환되면 또는 10분 최대 시간이 지나면 비교 표로 진행합니다 — 이 검사는 정보 제공용이며 4단계를 차단하지 않습니다.

완화 후 감지된 도메인 확인:

Terminal window
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}]}'

완화 상태에 대한 스크립트 확인:

Terminal window
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}]}'
검사예상상태
기준선 깨끗함 (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단계 — 정리로 진행하십시오.