CSP
콘텐츠 보안 정책(Content Security Policy, CSP)은 신뢰된 웹 페이지 콘텍스트에서
악의적인 콘텐츠를 실행하게 하는 사이트 간 스크립팅(XSS), 클릭재킹,
그리고 기타 코드 인젝션 공격을 예방하기 위해 도입된 컴퓨터 보안 표준
출처: https://ko.wikipedia.org/wiki/%EC%BD%98%ED%85%90%EC%B8%A0_%EB%B3%B4%EC%95%88_%EC%A0%95%EC%B1%85
Response Header를 통해 어떤 룰을 적용할 것인지 설정 할 수 있고, 예시는 아래와 같음
Content-Security-Policy: default-src 'self'; script-src 'self' 'ar9ang3.com' 'unsafe-inline'
정책 디렉티브는 지시어 종류(예. default-src, script-src)와
1개 이상의 출처(예. 'self', https:, *.example.com)가 스페이스로 분리된 형태로 지정
CSP에서 기본적으로 사용할 수 있는 Origin 명세
<host-source> | 호스트와 포트로 판별 | https://*.example.com example.com:443 http://test.example.com |
<scheme-source> | URL 스키마로 판별 | http:, https:, data:, blob:, ... |
'self' | 같은 Origin의 자원만 허용 | 'self' |
'unsafe-eval' | eval() 등 안전하지 않은 함수를 허용 | 'unsafe-eval' |
'unsafe-inline' | 유효한 nonce나 해쉬가 지정되지 않은 <script>, javascript: URL 등을 허용 |
'unsafe-inline' |
'none' | 어떤 Origin도 허용하지 않음 | 'none' |
nonce-<base64> | ase64로 지정된 nonce를 지정 | 'nonce-CAxn148fFUvd9u3201Gy=' |
<hashalg>-<base64> | Base64로 지정된 해쉬 값을 사용하여 추후 로드되는 자원의 해쉬와 비교 |
sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb3g== |
위 헤더가 Response를 통해 Client Side로 전달되면 브라우저는 이를 해석
default-src는 DOM의 기본 객체(frame, script, style, img, base 등..)의 출처(resource)를 모두 설정하는 내용입니다.
script-src는 위 default-src에서 일괄적으로 설정한것이 아닌 script tag의 출처만을 설정하는 내용
설정 값 중 self는 자기 자신의 도메인만을 신뢰한다는 뜻이고, example.com 등 특정 도메인을 지정 가능
script-src 가 ‘none’으로 설정되어 있을 경우 그 어느 스크립트도 해당 DOM에서 실행되지 못합
unsafe-inline은 DOM에서 일어나는 inline script를 허용
따라서 위와같이 Content-Security-Policy가 적용되어 있을 경우
와 같은 태그는 출처가 CSP를 통과하지 못하여 로드하지 않게 됨
<script nonce="1AfdcQ8/gY+d1Yarc7=="> 와 같이 특정 nonce 속성이 입력된 태그만을 허용하며,
추가로 <base> 태그가 현재 페이지가 참조하는 상대 경로들이 해석되는 기준점을 바꾸지 못하도록 함
nonce 값은 공격자가 예측할 수 없도록 페이지를 접근할 때마다 재생성하여야 함
Content-Security-Policy: default-src 'nonce-1AfdcQ8/gY+d1Yarc7=='; base-uri 'none'
다음은 SHA384 해쉬가 38b060a751ac9638...4898b95b 인 스크립트를 허용하는 CSP 헤더
Content-Security-Policy: script-src 'sha384-OLBgp1GsljhM2TJ+sbHjaiH9txEUvgdDTAzHv2P24donTt6/529l+9Ua0vFImLlb3g=='
출처: https://defenit.kr/2020/02/11/Web/%E3%84%B4%20Research/CSP-Bypass-Tips/
CSP Bypass
신뢰하는 도메인에 파일 업로드
만약 해당 웹 사이트가 파일 업로드 및 다운로드 기능을 제공한다면,
공격자는 해당 사이트에 스크립트 등을 업로드한 뒤
다운로드 주소로 대상 웹 페이지에 해당 자원을 포함시킬 수 있음
<script src="/download_file.php?id=177742"></script>
nonce 예측 가능
nonce를 사용할 때에는 nonce 값을 담고 있는
HTTP 헤더 또는 <meta> 태그가 캐시되지 않는지 주의
PHP나 CGI 계열 스크립팅을 사용할 때에는 특히 주의하여야 하는데,
이는 스크립트들이 마치 디렉토리처럼 /index.php/style.css 와 같이
뒤에 추가적인 경로를 붙여 접근될 수 있기 때문
만약 캐시 서버가 확장자를 기반으로 캐시 여부를 판단한다면
.css 는 일반적으로 정적 파일이므로 동적 콘텐츠로 간주하지 않아 캐시에 저장할 수 있고,
이 경우 캐시가 만료될 때까지 요청시마다 같은 nonce가 돌아오기 때문에
공격자는 이를 바탕으로 nonce를 획득
콘텐츠가 캐시되어 서버측 XSS가 일어나지는 않으나,
DOM XSS 등 클라이언트측에서 일어날 수 있는 공격에 취약
base-uri 미지정
HTML에서 하이퍼링크에서 상대 경로를 지정하면
브라우저는 마치 파일 경로처럼 기본적으로 현재 문서를 기준으로 주소를 해석
HTML <base> 요소는 상대 경로가 해석되는 기준점을 변경할 수 있도록 하며
<a>, <form> 등의 target 속성의 기본값을 지정
만일 공격자가 와 같은 마크업을 삽입하게 된다면
추후 상대 경로를 사용하는 URL들은 본래 의도한 위치가 아닌
공격자의 서버에 자원을 가리키게 되어 공격자는 이를 통해 임의의 스크립트 등을 삽입가능
본래 <base> 태그의 href 속성을 사용하지 않는 페이지라면
이를 방어하기 위해 다음과 같은 정책을 설정
Content-Security-Policy: base-uri 'none';
'Web 관련' 카테고리의 다른 글
WSGI, WAS, CGI (0) | 2020.06.03 |
---|---|
CGI (Common Gateway Interface) (0) | 2020.05.24 |
SOP(Same Origin Policy) (0) | 2020.05.13 |
Web server and Web application (0) | 2020.05.13 |
URI URL (0) | 2020.04.29 |