본문 바로가기

프론트엔드 로드맵

프론트엔드 로드맵 24 - 웹보안지식 : HTTPS/CORS/컨텐츠 보안 정책/OWASP 보안 취약점

반응형

<HTTP의 보안 취약점>

HTTP(HyperText Transfer Protocol, 웹 서버와 클라이언트 컴퓨터 사이에 웹 브라우저에 문서를 불러오기 위한 통신 규약)는 정보를 텍스트로 주고 받는다. 단순 텍스트이기 때문에 네트워크에서 전송 신호를 인터셉트하는 경우 원하지 않는 데이터 유출이 발생할 수 있다. 이 취약점을 보안하기 위해 나온 프로토콜이 HTTPS다.

 

HTTP에 S(Secure Socket)가 추가된 것이다. 기본 틀은 HTTP와 거의 동일하나 데이터 주고 받는 과정에서 '보안'요소가 추가됐다. HTTPS는 웹 서버에 접속하는 클라이언트에게 모두 다른 암호를 제공한다. 또 서버와 클라이언트가 2개의 키를 서로 암호화한다. 한 키는 공개키 저장소에 등록해 사용하고, 나머지는 개인키로 이용해 통신한다. 클라이언트는 공개키를, 서버는 개인키를 이용해 보호한다. 따라서 개인정보, 회원가입, 결제 시스템 등이 포함된 경우 HTTPS를 이용하는 것이 좋다.

HTTPS에 보안 기능이 추가된 만큼 HTTP보다는 처리 속도가 느릴 수 밖에 없다. 그러나 요즘 서버와 네트워크 상태가 좋아 체감하기 어려울 정도에 불과하다. 또 HTTPS는 검색 엔진 최적화에 도움이 된다. 

 

<CORS 보안 취약점>

CORS(Cross Origin Resource Sharing: 도메인 또는 포트가 다른 서버의 자원을 요청하는 매커니즘)는 XMLHttpRequest를 사용해 다른 도메인으로의 자원에 접근할 수 있는 권한을 갖는다. CORS를 이용하면 다른 도메인에서의 리소스를 공유할 수 있지만, 동일 출처 정책(same-origin policy)으로 보안상 차단된다. 

 

<콘텐츠 보안 정책>

콘텐츠 보안 정책(CSP : Content Security Policy)
웹의 보안 모델은 동일 출처 정책 Same-origin에 근간을 두고 있다. 코드와 액세스 권한은 각 웹에만 안전하게 격리되어 있으나, 공격자는 이 시스템을 쉽게 파괴할 수 있다.

 교차 사이트 스크립팅(XSS) 공격은 사이트를 속여 악성 코드를 의도된 콘텐츠와 함께 전달해 동일 출처 정책을 우회한다. XSS Cheat Sheet은 오래된 방법이지만 악성코드를 삽입해 사용자 세션 데이터에 접근하고 비밀로 할 정보들이 넘어간다. 이를 방지하기 위해 콘텐츠 보안 정책을 방어책으로 두고 있다.

 

1. 소스 허용 목록

HTTP 헤더에 Content-Security-Policy 허용 목록 생성 코드를 적용하는 방법이다. 

Content-Security-Policy: script-src 'self' apis.google.com

위의 현재 페이지는 물론 apis.google.com에서 제공되는 자바스크립트를 충실히 다운로드하되 다른 소스에서 실행되는 스크립트는 오류 발생하도록 한다.

 

script-src 외에도 허용 리소스를 세분화해서 제어할 수 있는 다양한 지시문들이 있다. 지시문을 설정하지 않으면 다 허용한다는 것과 같다. 지시문은 세미콜론으로 구분된다.

- base-uri 

- child-src (유튜브 동영상 삽입 가능 frame-src 대신 사용)

- connect-src 

- font-src 

- form-action 

- frame-ancestors 

- img-src 

- media-src 

- object-src 

- plugin-types 

- report-uri 

- style-src 

- upgrade-insecure-requests (HTTP를 HTTPS로 변경하도록 지시)

 

2. sandbox샌드박싱

페이지가 로드할 수 있는 리소스가 아니라 페이지가 취할 수 있는 작업에 제한을 둔다. sandbox 지시문이 있는 경우, 페이지는 sandbox 속성을 가진 <iframe> 내부에서 로드된 것처럼 취급된다.

 

3. 메타 태그

</meta http-equiv="content-security-policy" content="default-src>; child-src 'none'; object-src 'none'">

frame-ancestors, report-uri 또는 sandbox에는 사용할 수 없다.

 

4. 인라인 코드 쓰지 않기

XSS 공격으로 발생하는 최대 위협은 인라인 스크립트 주입 문제다. 악성 페이로드를 포함하는 스크립트 태그를 공격자가 주입하면, 브라우저는 이를 막을 방법이 없다. script 태그의 콘텐츠를 외부 파일로 이동하고 addEventListener() 호출로 바꾼다.

 

eval(), new Function(), setTimeout([string], ...) 및 setInterval([string], ...) 등도 악성 코드가 실행될 수 있다. eval에 의존하지말고 JSON.parse를 통해 JSON을 파싱합니다.

 

setTimeout("document.querySelector('a').style.display = 'none';", 10);

위 코드는

setTimeout(function () {

  document.querySelector('a').style.display = 'none';

}, 10);

이렇게 작성하는 것이 더 낫다.

 

<OWASP 이란?>

OWASP (Open Web Application Security Project : 오픈 소스 웹 애플리케이션 보안 프로젝트)는 주로 웹에 관한 정보 노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하며, 10대 웹 애플리케이션의 취약점(OWASP TOP 10)을 발표한다.

 

OWASP 2020 (2020년에 발표된 OWASP)는

1. 인젝션 (Injection)

공격자가 SQL 쿼리 등에 신뢰할 수 없는 데이터를 주입하는 것이다. 웹 애플리케이션은 주입된 모든 코드들을 검증하고 분류하기 힘들다. SQL 주입을 막으려면

- 명령문 및 쿼리와 데이터를 분리한다.

- 안전한 API를 사용한다. 

- SQL 쿼리 내에 LIMIT 기능 및 기타 SQL 컨트롤 사용

 

2. 취약한 인증 Broken Authentication.

인증에 취약성이 있는 웹 사이트는 공격자가 시스템에서 원하는 계정을 제어하고 더 나아가 시스템까지 완벽 제어할 수 있다. 자동 완성과 같은 자동화된 공격을 허용하며 약하게 암호화된 암호들을 공격한다. 이를 방지하려면

- 가능한 자동 완성 등을 방지하기 위해 다중 요소 인증을 구현한다.

- 새 암호 또는 변경된 암호 등을 테스트하는 등 취약한 암호 검사를 한다

- 로그인 실패 시도에 제한을 준다. 또는 공격 등이 탐지되면 이를 기록하고 관리자에 전달한다


3. 민감 데이터 노출 Sensitive Data Exposure.

자격증명, 신용 카드 번호, 사회 보장 번호, 의료 정보, 개인 식별 가능 정보, 기타 개인 정보 등의 민감한 데이터를 손상시키는 방식이다. 데이터는 두 종류로 나뉘는데 저장된 데이터와 전송된 데이터(서버간에 또는 웹 브라우저 내부적으로)다. 두가지 모두 보호되어야 하며 전송 중인 데이터의 경우 SSL(Secure socket Layer) 인증서로 보호한다. 

 

4. XML 외부 엔터티 XML External Entities (XXE)

XML 입력시 외부 엔터티에 대한 참조의 취약성에서 발생한 공격이다. XML 구문 분석기는 이 XXE 공격에 기본적으로 취약하다. 이를 방지하기 위해

- 가능한 JSON 같은 덜 복잡한 데이터 형식을 사용하고 중요한 데이터의 직렬화를 방지하라

- 모든 XML 프로세서 및 라이브러리를 패치하거나 업그레이드 한다.

- XML 문서, 헤더 또는 노드 내에 서버 측 입력 유효성 검사, 필터링 등을 구현한다

- SAST 툴 

 

5. 취약한 접근 제어 Broken Access control.

웹사이트에서 방문자들이 접근할 수 있는섹션이나 페이지에 대한 접근에 공격하는 것을 말한다. 주요 콘텐츠의 관리 시스템 문제다. 접근 제어 기능이 손상될 경우, 공격자는 계정 정보에 액세스하는 SQL 쿼리에 확인되지 않은 데이터를 사용하거나, 특정 URL로 강제 이동 시킨다. 이로 인한 위험을 줄이기 위해서

- 필요없는 계정과 서비스는 그때그때 제거한다.

- 서버와 웹 사이트를 수시로 점검한다.

 

6. 보안 오류 구성 Security misconfigurations

다소 보안이 결함된 CMS 기본 구성을 그대로 유지하는 것이다. 기본 설정을 변경해 안전한 설치 시스템을 구축함으로써 공격을 줄일 수 있다.

- 불필요한 기능, 구성요소, 사용하지 않는 프레임워크를 제거하거나 설치하지 마라

- 클라우드 스토리지 사용 권한 검토

- 클라이언트에 보안 지침 보내기

 

7. 크로스 사이트 스크립팅 Cross Site Scripting (XSS)

악의적인 클라이언트 스크립트를 웹사이트에 삽입하고 여기에 접근하는 클라이언트에 전파하는 방법이다. XSS에 취약한 플러그인을 사용하는 경우, 공격자는 브라우저에 새 관리자를 만들거나 게시물을 편집하는 등의 공격을 한다. 최근 프레임워크 (RubyonRails, ReactJS 등)를 사용해 XSS를 보호한다.

 

8. 안전하지 않은 역직렬화 Insecure Deserialization

역직렬화 구조는 직렬화된 결과물을 역으로 직렬화해 바이트 문자열을 다시 객체로 변환한다. 직렬화 과정에서 ID, 암호 등이 포함된 슈퍼쿠키를 이용해 객체를 변경하고 관리자 권한을 뺏는다. 

 

https://sucuri.net/guides/owasp-top-10-security-vulnerabilities-2020/ (해당 링크에서 번역했습니다. 오역이 있는 경우 말씀해주세요)

 

참고 사이트 : 

http://www.igloosec.co.kr/BLOG_HTML5%20%EB%B3%B4%EC%95%88%20%EC%B7%A8%EC%95%BD%EC%A0%90?searchItem=&searchWord=&bbsCateId=0&gotoPage=10

https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

https://developers.google.com/web/fundamentals/security/csp?hl=ko

https://sucuri.net/guides/owasp-top-10-security-vulnerabilities-2020/

 

 

 

 

반응형