CSP
CSP
는 Content Security Policy의 약자로 XSS
공격 기법이나 데이터를 삽입하는 기법을 막기위해 추가된 보안 기법이다. CSP
를 사용하면 웹페이지 내에 있는 모든 자원들이 제한된 곳에서만 로드되어야 하도록 설정할 수 있다.
CSP 기본 정책
우선 CSP
의 기본정책에는 여러 종류가 있다.
Inline Code
CSP
는 인라인 코드 (Inline Code)를 유해하다고 간주한다. 따라서 CSP
를 사용할 때에는 기본적으로 인라인 코드가 사용이 불가능하다.
인라인 코드란 <script>alert(1);</script> 와 같은 태그 내에 코드를 실행하는 것을 말한다.
또한, on*
이벤트 핸들러 속성, javascript:
URL 스킴 또한 인라인 코드로 간주하고 허용하지 않는다.
CSP
에서는 script src="alert.js"></script>
와 같은 src
속성을 이용해 정의하는 방식을 권장한다.
Eval
CSP
는 기본적으로 문자열 텍스트를 실행 가능한 자바스크립트 코드 형태로 변환하는 메커니즘 또한 유해하다고 간주해 eval
과 같은 함수를 막는다. 해당 함수에 문자열 입력이 아닌 인라인 함수 형태로 파라미터가 전달 될 때에는 차단되지 않는다.
CSP
CSP
로 설정할 수 있는 지시문은 아래와 같다.
지시문 | 설명 |
default-src | -src로 끝나는 모든 리소스의 기본 동작을 제어한다. 만약 CSP 구문 내에서 지정하지 않은 지시문이 존재한다면 default-src의 정의를 따라간다 |
img-src | 스크립트 태그 관련 권한과 출처를 제어한다. |
script-src | 스크립트 태그 관련 권한과 출처를 제어한다. |
base-uri | 페이지의 <base> 태그에 나타날 수 있는 URL을 제어한다. |
지시문의 값에 해당하는 출처의 종류는 아래와 같다.
출처 | 설명 |
도메인주소 | 와일드카드를 이용해 표현할 수 있다. |
none | 모든 출처를 허용하지 않는다. |
self | 페이지의 현재 출처 (Origin) 내에서 로드하는 리소스만 허용한다. |
unsafe-inline | 예외적으로 인라인 코드의 사용을 허용한다. |
unsafe-eval | 예외적으로 eval과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용한다. |
nonce | nonce 속성을 설정하여 예외적으로 인라인 코드를 사용한다. <base64-value> 는 반드시 요청마다 다른 난수 값으로 설정해야 한다. 해당 출처를 설정하면 unsafe-inline 은 무시된다. |
CSP bypass
CSP
를 우회할 수 있는 방법은 다양하다. 일단 wargame을 풀다가 알게된 하나의 방법을 소개하겠다.
우선 위에서 언급한 base-uri
지시문이 설정이 안되있을때 <base href="개인주소">
로 설정해서 우회할 수 있다.