SlideShare una empresa de Scribd logo
1 de 43
이 형 규
XSS는 네가 맡아라
2
목차
• XSS 소개
• XSS 공격 유형
• XSS 방어 방법
• Lucy-Xss-Filter 소개
• Lucy-Xss-Servlet-Filter 소개
2
3
XSS 란 ?
3
4
XSS 란 ?
4
5
XSS 란 ?
• XSS 취약점은 애플리케이션이 신뢰할 수 없는 데이터를 가져와 적절한 검증
이나 제한 없이 웹브라우저로 보낼 때 발생한다.
• 전 세계 시스템 공격 방법 통계에서도 XSS는 6.2%를 차지하고 있다.
• SANS에서 가장 위험한 25대 소프트웨어 오류에서 4번째로 선정
• 사용자 세션 탈취, 웹사이트 변조, 악의적인 사이트로 이동할 수 있다.
5
6
XSS 공격 유형
1. 게시판에 특정 스크립트를 작성
한 뒤 불특정 다수가 보도록 유도
2. 스크립트가 시작하여 열람자의
쿠키 값을 가로챔
4. 공격자는 열람자의 정보로 로그
인
3. 가로챈 쿠키 값을 웹 프록시 등
을 이용하여 재전송
• 쿠키정보/세션 ID 획득
• 관리자 권한 획득
• 악성코드 다운로드
6
7
XSS 방어 방법
• 기도
7
8
XSS 방어 방법
• 입, 출력 값 검증 및 무효화
• 자체 구현
• 오픈소스 라이브러리 사용
• OWASP ESAPI
• Apache.commons.lang3.StringEscapeUtils
• HTML PURIFIER
• XSSPROTECT
• XSS-HTML-FILTER
8
9
XSS 방어 방법 – 자체구현(전자정부 프레임워크)
web.xmlHTMLTagFilter.java
9
10
XSS 방어 방법 – 라이브러리 사용(OWASP)
10
11
Lucy-Xss-Filter 소개
library Date License WhiteList Sax Parser Dom
Parser
Mal-
formed
HTML
Support
Easy
Config
xssprotect 2008.02 Apache
2.0
N N Y N N
xss-html-
filter
n/a CC BY-SA
2.5
Y Y X Y N
HTMLPuri
fier
2012.01.
18
LGPL Y X Y Y Y
lucy-xss-
filter
2012.09.
24
Apache
2.0
Y Y Y Y Y
11
12
Lucy-Xss-Filter 소개
- DOM Parser, SAX Parser 방식 모두 사용 가능, 특히 SAX Parser 방식을 사용할 경우 Input String 용량 대비 3
배정도의 적은 추가 Heap 메모리 만으로도 필터링이 가능해 DOM Parser방식에 비해 동시에 많은 데이터 처리 가
능.
- xml 기반의 화이트리스트 필터링 방식사용. 이미 파악된 공격 유형만 필터링 하는 블랙리스트 방식과 달리, 화이
트리스트 방식은 허용되는 내용을 제외한 모든 부분을 필터링 하기 때문에 새로운 공격 유형도 필터링 가능하다.
- 화이트리스트 상위 설정 파일에 대한 상속 및 오버라이딩(overriding)이 가능하도록 구현되어 있다. 따라서, 보안
검수팀에서 제공하는 상위 설정 파일을 상속받는 것만으로도 모든 기본 보안 정책이 적용되며, 서비스에 따라 변경
이 불가피한 필터링 규칙은 하위 파일에서 재정의할 수 있어 서비스에 맞게 수정가능하다.
- 기능 확장이 가능한 Element Listener, Attribute Listener 제공. 악의적인 XSS 코드를 변환/삭제하는 기능 이외
에 특정 요소에 하위 요소를 추가하거나 데이터를 변경할 수 있도록 이벤트 처리 인터페이스를 제공한다.
12
13
Lucy-Xss-Filter 소개 (진짜 장점...)
• 한국어 문서
• 개발자가 한국어 구사
• 질의응답을 한국어로 할 수 있음
13
14
Lucy-Xss-Filter 소개
14
15
Lucy-Xss-Filter 소개
출처 : http://m.inven.co.kr/board/powerbbs.php?come_idx=3553&l=3
방패(Lucy-Xss-Filter)
방어주문(Lucy-Xss-Servlet-Filter)
15
16
Lucy-Xss-Filter 소개
16
17
Lucy-Xss-Filter 사용법
동작 그만.
네이버 오픈소스
홍보냐 ?
증거 있어 ?
이게 홍보가 아니라는
거에 내 깃헙 계정을
건다.
10
17
18
Lucy-Xss-Filter 사용법
• https://github.com/naver/lucy-xss-filter
• http://search.maven.org/#search|ga|1|lucy-xss
• 네이버 개발자 센터의 xss 프로젝트는 더 이상 관리되지 않습니다.
(http://dev.naver.com/projects/lucy-xss/)
18
19
Lucy-Xss-Filter 사용법
• 두 가지 자바 클래스를 사용함
• XssPreventer
• XssFilter
• XssSaxFilter (Sax 방식)
• XssFilter(Dom 방식)
<dependency>
<groupId>com.navercorp.lucy</groupId>
<artifactId>lucy-xss</artifactId>
<version>1.6.3</version>
</dependency>
• maven dependency
19
20
Lucy-Xss-Filter 사용법 - XssPreventer
• Apache Common Lang3 사용
org.apache.commons.lang.Entities
public void escape(Writer writer, String str) throws IOException {
…
if (c > 0x7F) {
writer.write("&#");
writer.write(Integer.toString(c, 10));
writer.write(';');
…
}
org.apache.commons.lang3.text.translate.LookupTranslator
public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
…
// descend so as to get a greedy algorithm
for (int i = max; i >= shortest; i--) {
final CharSequence subSeq = input.subSequence(index, index + i);
final CharSequence result = lookupMap.get(subSeq.toString());
…
}
20
21
Lucy-Xss-Filter 사용법 - XssPreventer
• HTML4 Entity 기준으로 문자열 escape 수행
(http://www.w3schools.com/charsets/ref_html_entities_4.asp)
22
Lucy-Xss-Filter 사용법 - XssPreventer
테스트 전후 결과
@Test
public void testXssPreventerUnicode() {
String dirty = ""><script>alert(‘xss');</script>";
String clean = XssPreventer.escape(dirty);
Assert.assertEquals(clean, "&quot;&gt;&lt;script&gt;alert(&#39;xss&#39;);&lt;/script&gt;");
Assert.assertEquals(dirty, XssPreventer.unescape(clean));
}
22
23
Lucy-Xss-Filter 사용법 - XssSaxFilter
• 웹 애플리케이션을 보호하는 기능을 화이트리스트(White List) 설정 방식으로 구현한 Java 기반의 필터 라
이브러리
23
24
Lucy-Xss-Filter 사용법 - XssSaxFilter
SAX DOM
메모리 Input 용량(파일용량기준) 대비 8배 Input 용량(파일용량기준) 대비 18배
속도 6M HTML 1초 6M HTML 1.4초
* 중첩된 태그 깊이가 깊어지면, 속도가 심
하게 느려짐
(재귀함수 호출이 많아져서)
thread safe? Yes Yes
memroy leak? No No
oom?
Yes
(ex) 1024M 가용메모리 상황에서 22
개 쓰레드에서 동시에 6M HTML을 필
터링 할 경우 OOM 발생가능)
Yes
(ex) 1024M 가용메모리 상황에서 9개 쓰
레드에서 동시에 6M HTML을 필터링 할 경
우 OOM 발생가능)
stack overflow? No Yes
• SAX vs DOM
24
25
Lucy-Xss-Filter 사용법 - XssSaxFilter
오픈소스 개발자
보안(공통) 관리자
서비스 개발자
• lucy-xss-default-sax.xml
• Jar 파일에 포함되어 함께 배포되는 기본 설정 파일
• html element와 attribute가 정의되어 있음
• lucy-xss-superset-sax.xml
• 보안 or 공통팀 담당자가 작성하는 보안 설정 파일
• 전사 공통으로 XSS 공격 필터링 여부와 패턴을 정의함
• lucy-xss-sax.xml
• 서비스 담당자가 작성하는 보안 설정 파일
• 서비스에 특화된 XSS 공격 필터링 여부와 패턴을 정의함
• 위의 모든 설정을 상속받음
25
26
Lucy-Xss-Filter 사용법 - XssSaxFilter
• 설정 방법
<elementRule>
<element name="body" disable="true" />
<element name="embed" disable="true" />
<element name="iframe" disable="true" />
<element name="meta" disable="true" />
<element name="object" disable="true" />
<element name="script" disable="true" />
<element name="style" disable="true" />
<element name="link" disable="true" />
<element name="base" disable="true" />
</elementRule>
<attributeRule>
<attribute name="src" base64Decoding="true">
<notAllowedPattern><![CDATA[(?i:s*c*r*i*p*t*:)]]></notAllowedPattern>
</attribute>
</attributeRule>
26
27
Lucy-Xss-Filter 사용법 - XssSaxFilter
• com.nhncorp.lucy.security.xss.XssSaxFilter
@Test
public void testDirtyCodeFiltering() throws Exception {
XssSaxFilter filter = XssSaxFilter.getInstance("lucy-xss-superset-sax.xml");
String dirty = "<IMG SRC="javascript:alert!('XSS');">";
String clean = filter.doFilter(dirty);
System.out.println("clean : " + clean);
Assert.assertFalse("n" + dirty + "n" + clean, dirty.equals(clean));
}
28
Lucy-Xss-Filter 사용법 - XssSaxFilter
• com.nhncorp.lucy.security.xss.event.ElementListener
• 악의적인 XSS 코드를 변환/삭제하는 기능 외에 특정 요소에 하위 요소를 추가하거나 데이터를 변경해야 하는
경우가 발생할 수 있다. ElementListener는 설정 기반으로 요소를 처리할 때 이벤트를 획득하여 별도의 작업을
추가할 수 있는 기능을 제공한다.
public class EmbedListener implements ElementListener {
public void handleElement(Element e) {
// autostart="false" 추가
e.putAttribute("autostart", ""false"");
// <param> 요소 추가
e.addContent(new Element("param"));
}
}
<element name="embed">
<!-- ElementListener 인터페이스를 구현한 클래스 이름을 기술한다. -->
<listener>com.nhncorp.lucy.security.xss.test.EmbedListener</listener>
</element>
28
29
Lucy-Xss-Filter 사용법 - XssSaxFilter
• com.nhncorp.lucy.security.xss.event. AttributeListener
• 특정 Attribute에 대한 이벤트 Listener 설정이다. 가령 특정 attribute에 AttributeListener를 설정하면, 모든
Element의 해당 attribute 에 대해 특정 작업을 수행할 수 있다.
public void handleAttribute(Attribute attr) {
if (!this.isWhiteUrl(attr.getValue())) {
attr.setValue("""");
}
}
private boolean isWhiteUrl(String url) {
…
}
<attributeRule>
<attribute name="src">
<listener>com.nhncorp.lucy.security.xss.listener.SrcAttributeListener</listener>
</attribute>
</attributeRule>
29
30
Lucy-Xss-Filter 사용법
https://github.com/naver/lucy-xss-filter/blob/master/docs/manual/kr/01.%20summary/1.3%20selection%20criterion.md
XssPreventer VS XssFilter
• XssPreventer는 파라미터로 받은 문자열을 단순히 escape 하는 XSS공격 방어 라이브러리
• XssSaxFilter 는 보안에 중점을 두면서도, HTML 태그 또한 정상 동작하도록 하는 White List 방식의 XSS
공격 방어 라이브러리
즉 HTML이 아닌 단순 텍스트 파라미터에 대해서는 XssPreventer를 사용해 전체를 escape 하는 것이 올바른
대응 방법이고 게시판, 메일, 방명록 등 HTML 태그 기능이 필요한 서비스는 XssSaxFilter를 사용해 필터링 하
는 것이 효과적인 방법이므로 개발자는 두 가지 상황을 고려해 방어 라이브러리를 사용해야 한다.
마지막으로 사용자 입력데이터가 뷰에 다시 노출시킬 목적이 아닌 Business Logic에만 쓰이는 데이터일 경우에
는 둘 다 사용하지 말아야 한다. 불필요한 eacape/unescape이 발생해 원본데이터가 훼손될 수 있다.
30
31
Lucy-Xss-Servlet-Filter 소개
이런 노력에도 불
구하고 여전히
XSS공격을
뿌리 뽑을 순 없었
습니다...
31
32
Lucy-Xss-Servlet-Filter 소개
32
33
Lucy-Xss-Servlet-Filter 소개
다구리에 장사 없음
33
34
Lucy-Xss-Servlet-Filter 소개
• XSS 공격만 걸러내는 Filter를 만들어 서블릿으로 데이터가 전달되는 길목에
서 사전에 XSS 공격을 필터링 하기로 함
드루와 드루와
34
35
Lucy-Xss-Servlet-Filter 소개
XSS 공격 방어 체크를 누락
하여 보안에 허점 발생
필터링 대상이 아닌데 XSS
Filter 를 적용하여 서비스
성능에 저하
입력 데이터 중 HTML이 있
음
개발하기도 바쁜데 일일히
신경쓰기 싫다.
• 하지만 여전히 문제는 존재함
35
36
Lucy-Xss-Servlet-Filter 소개
• 상황별 Filter를 선택 가능한 설정 제공
• XssPreventer
• XssSaxFilter
• XssDomFilter
• 필터링을 제외할 수 있는 설정 제공
• URL
• Prefix
• Name
36
37
Lucy-Xss-Servlet-Filter 사용법
• maven dependency
<dependency>
<groupId>com.navercorp.lucy</groupId>
<artifactId>lucy-xss-servlet</artifactId>
<version>1.0.2</version>
</dependency>
• web.xml
<filter>
<filter-name>requestParamFilter</filter-name>
<filter-class>com.naver.service.filter.requestparam.RequestParamFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestParamFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
• 아직 github 공개 전 ... 조만간 예정되어 있음
37
38
Lucy-Xss-Servlet-Filter 사용법
<config xmlns="http://www.navercorp.com/request-param">
<defenders>
<defender>
<name>preventer</name>
<class>com.naver.service.filter.requestparam.defender.XssPreventerDefender</class>
</defender>
</defenders>
…
<default>
<defender>preventer</defender>
</default>
<global>
<params>
<param name="q" useDefender="false" />
<param name="globalprefix3" usePrefix="true" useDefender="false" />
</params>
</global>
…
<url-rule-set>
<url-rule>
<url>/search.nhn</url>
<params>
<param name="query" useDefender="false" />
</params>
<url disable="true">/disabletest1.nhn</url>
</url-rule>
</url-rule-set>
</config>
…
38
39
Lucy-Xss-Servlet-Filter 장단점
• XML 설정 만으로 XSS 방어가 가능해짐
• 코드 수정이 발생하지 않음
• 개발자가 XSS 방어를 신경 쓰지 않아도 됨
• XSS 방어가 누락되지 않음
• 설정 파일 하나로 XSS 방어절차가 파악됨
• 파라메터명에 대해 관리가 필요해짐
• 일괄 적용되어 영향 받기 때문에 사전 설계가 중요함
39
40
Lucy-Xss-Servlet-Filter 장단점
• XML 설정 만으로 XSS 방어가 가능해짐
• 코드 수정이 발생하지 않음
• 개발자가 XSS 방어를 신경 쓰지 않아도 됨
• XSS 방어가 누락되지 않음
• 설정 파일 하나로 XSS 방어절차가 파악됨
• 파라메터명에 대해 관리가 필요해짐
• 일괄 적용되어 영향 받기 때문에 사전 설계가 중요함
신규로 개발하는 서비스에는 lucy-xss-servlet-filter를 사용하는 것을 추천하지만 기존 잘
운영되는 시스템에 lucy-xss-servlet-filter를 사용하는 것은 추천하지 않습니다. 입력 파
라메터가 전부 필터링 되기 때문에 의도치 않은 결과가 발생할 수 있기 때문입니다.
기존 시스템에 적용하시려면 lucy-xss-filter를 사용해 일일히 필터링 하는 방식을 추천드
립니다.
하지만 테스트 시간 확보가 충분히 되신다거나 기존에 서블릿 필터 기반으로 XSS 공격을
방어하셨다면 이번 기회에 lucy-xss-servlet-filter를 적용해 XSS 공격에서 해방되시는 것
도 나쁘지는 않습니다.
39
41
오픈소스
아직 부족한 점이 많습니다.
사용자 분들의 contribution(bug reporting, bug fix, proposal) 을 환영합니다. ^^
40
42
참고문헌
• 한국인터넷진흥원 (http://www.kisa.or.kr/uploadfile/201312/201312161355109566.pdf)
• OWASP (https://www.owasp.org/images/2/2c/OWASP_Top_10_-_2013_Final_-_Korean.pdf)
• 정보보안개론(http://www.hanbit.co.kr/preview/1331/sample_chap5.pdf)
41
43
어때요
끝
월요일엔 아마 바쁘지 않을까
화요일도 성급해 보이지 안 그래
수요일은 뭔가 어정쩡한 느낌
목요일은 그냥 내가 왠지 싫어
우~ 이번 주 금요일
우~ 금요일에 시간 어때요
Github 에서 만나요
Star를 눌러 주세요
42

Más contenido relacionado

La actualidad más candente

Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em JavaDenis L Presciliano
 
3 0 cap 003
3 0 cap 0033 0 cap 003
3 0 cap 003luisadr
 
Approximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming ApplicationsApproximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming ApplicationsDebasish Ghosh
 
Lógica de Programação - Vetor
Lógica de Programação - VetorLógica de Programação - Vetor
Lógica de Programação - VetorWesley R. Bezerra
 
Aula 01 - Introdução ao C++
Aula 01 - Introdução ao C++Aula 01 - Introdução ao C++
Aula 01 - Introdução ao C++PeslPinguim
 
Lógica de Programação com Javascript - Aula #04
Lógica de Programação com Javascript - Aula #04Lógica de Programação com Javascript - Aula #04
Lógica de Programação com Javascript - Aula #04Ramon Kayo
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱Suhyeon Jo
 
Introdução ao 12 Factors APP
Introdução ao 12 Factors APPIntrodução ao 12 Factors APP
Introdução ao 12 Factors APPDouglas Alonso
 
JShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java PlatformJShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java PlatformJavaDayUA
 
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스BOAZ Bigdata
 
Jquery ppt
Jquery pptJquery ppt
Jquery ppt044249
 
Java. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax ApplicationsJava. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax ApplicationsМарія Русин
 
diagrama de componentes
diagrama de componentesdiagrama de componentes
diagrama de componenteselliando dias
 
Managing and Versioning Machine Learning Models in Python
Managing and Versioning Machine Learning Models in PythonManaging and Versioning Machine Learning Models in Python
Managing and Versioning Machine Learning Models in PythonSimon Frid
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereJuliano Martins
 

La actualidad más candente (20)

Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
3 0 cap 003
3 0 cap 0033 0 cap 003
3 0 cap 003
 
Approximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming ApplicationsApproximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming Applications
 
Lógica de Programação - Vetor
Lógica de Programação - VetorLógica de Programação - Vetor
Lógica de Programação - Vetor
 
Aula 01 - Introdução ao C++
Aula 01 - Introdução ao C++Aula 01 - Introdução ao C++
Aula 01 - Introdução ao C++
 
Lógica de Programação com Javascript - Aula #04
Lógica de Programação com Javascript - Aula #04Lógica de Programação com Javascript - Aula #04
Lógica de Programação com Javascript - Aula #04
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱
 
Introdução ao 12 Factors APP
Introdução ao 12 Factors APPIntrodução ao 12 Factors APP
Introdução ao 12 Factors APP
 
JShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java PlatformJShell: An Interactive Shell for the Java Platform
JShell: An Interactive Shell for the Java Platform
 
POO - 16 - Polimorfismo
POO - 16 - PolimorfismoPOO - 16 - Polimorfismo
POO - 16 - Polimorfismo
 
Drools rule Concepts
Drools rule ConceptsDrools rule Concepts
Drools rule Concepts
 
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [카페 어디가?팀] : 카페 및 장소 추천 서비스
 
Sockets : Introdução
Sockets : IntroduçãoSockets : Introdução
Sockets : Introdução
 
Jquery ppt
Jquery pptJquery ppt
Jquery ppt
 
Java. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax ApplicationsJava. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax Applications
 
diagrama de componentes
diagrama de componentesdiagrama de componentes
diagrama de componentes
 
Requisitos de software
Requisitos de softwareRequisitos de software
Requisitos de software
 
Managing and Versioning Machine Learning Models in Python
Managing and Versioning Machine Learning Models in PythonManaging and Versioning Machine Learning Models in Python
Managing and Versioning Machine Learning Models in Python
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
 
A Linguagem UML
A Linguagem UMLA Linguagem UML
A Linguagem UML
 

Destacado

Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
내가써본 nGrinder-SpringCamp 2015
내가써본 nGrinder-SpringCamp 2015내가써본 nGrinder-SpringCamp 2015
내가써본 nGrinder-SpringCamp 2015Lim SungHyun
 
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterSpring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterRyosuke Uchitate
 
스프링 시큐리티로 시작하는 웹 어플리케이션 보안
스프링 시큐리티로 시작하는 웹 어플리케이션 보안스프링 시큐리티로 시작하는 웹 어플리케이션 보안
스프링 시큐리티로 시작하는 웹 어플리케이션 보안HyungTae Lim
 
스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 라한사 아
 
대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안
대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안
대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안Eunjeong (Lucy) Park
 
初心者大歓迎! Webアプリを作ってみよう!
初心者大歓迎!  Webアプリを作ってみよう! 初心者大歓迎!  Webアプリを作ってみよう!
初心者大歓迎! Webアプリを作ってみよう! 淳平 豊田
 
RIA Compopnent Model
RIA Compopnent ModelRIA Compopnent Model
RIA Compopnent ModelEthan Cha
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
[5분특강] 좌씨의 즐거운 SW 품질관리의 하루
[5분특강] 좌씨의 즐거운 SW 품질관리의 하루[5분특강] 좌씨의 즐거운 SW 품질관리의 하루
[5분특강] 좌씨의 즐거운 SW 품질관리의 하루mosaicnet
 
Keynotes 모바일어플리케이션응답시간관리
Keynotes 모바일어플리케이션응답시간관리Keynotes 모바일어플리케이션응답시간관리
Keynotes 모바일어플리케이션응답시간관리JaeWoo Wie
 
게임의 품질 위한 블랙박스 테스팅들
게임의 품질 위한 블랙박스 테스팅들게임의 품질 위한 블랙박스 테스팅들
게임의 품질 위한 블랙박스 테스팅들MyungHee Jin
 
솔루션 구축 사례를 통해 본 SW아키텍처
솔루션 구축 사례를 통해 본 SW아키텍처솔루션 구축 사례를 통해 본 SW아키텍처
솔루션 구축 사례를 통해 본 SW아키텍처Lim SungHyun
 
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요YongSik Jeong
 
Multi mechanize
Multi mechanizeMulti mechanize
Multi mechanizeSungMin OH
 
Spring知っておきたい
Spring知っておきたいSpring知っておきたい
Spring知っておきたいYuichi Hasegawa
 
Yeoman
YeomanYeoman
Yeomanymtech
 
Performance Testing using Loadrunner
Performance Testingusing LoadrunnerPerformance Testingusing Loadrunner
Performance Testing using Loadrunnerhmfive
 

Destacado (20)

Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
내가써본 nGrinder-SpringCamp 2015
내가써본 nGrinder-SpringCamp 2015내가써본 nGrinder-SpringCamp 2015
내가써본 nGrinder-SpringCamp 2015
 
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot StarterSpring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
 
스프링 시큐리티로 시작하는 웹 어플리케이션 보안
스프링 시큐리티로 시작하는 웹 어플리케이션 보안스프링 시큐리티로 시작하는 웹 어플리케이션 보안
스프링 시큐리티로 시작하는 웹 어플리케이션 보안
 
ESAPI
ESAPIESAPI
ESAPI
 
스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기
 
대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안
대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안
대한민국을 위한 Open Linked Political Data 플랫폼, "정치in" 제안
 
初心者大歓迎! Webアプリを作ってみよう!
初心者大歓迎!  Webアプリを作ってみよう! 初心者大歓迎!  Webアプリを作ってみよう!
初心者大歓迎! Webアプリを作ってみよう!
 
RIA Compopnent Model
RIA Compopnent ModelRIA Compopnent Model
RIA Compopnent Model
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
[5분특강] 좌씨의 즐거운 SW 품질관리의 하루
[5분특강] 좌씨의 즐거운 SW 품질관리의 하루[5분특강] 좌씨의 즐거운 SW 품질관리의 하루
[5분특강] 좌씨의 즐거운 SW 품질관리의 하루
 
Keynotes 모바일어플리케이션응답시간관리
Keynotes 모바일어플리케이션응답시간관리Keynotes 모바일어플리케이션응답시간관리
Keynotes 모바일어플리케이션응답시간관리
 
게임의 품질 위한 블랙박스 테스팅들
게임의 품질 위한 블랙박스 테스팅들게임의 품질 위한 블랙박스 테스팅들
게임의 품질 위한 블랙박스 테스팅들
 
REST
RESTREST
REST
 
솔루션 구축 사례를 통해 본 SW아키텍처
솔루션 구축 사례를 통해 본 SW아키텍처솔루션 구축 사례를 통해 본 SW아키텍처
솔루션 구축 사례를 통해 본 SW아키텍처
 
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
SpringCamp 2014 : 미국인에게 영어 프리젠테이션을 해봤어요
 
Multi mechanize
Multi mechanizeMulti mechanize
Multi mechanize
 
Spring知っておきたい
Spring知っておきたいSpring知っておきたい
Spring知っておきたい
 
Yeoman
YeomanYeoman
Yeoman
 
Performance Testing using Loadrunner
Performance Testingusing LoadrunnerPerformance Testingusing Loadrunner
Performance Testing using Loadrunner
 

Similar a Springcamp 2015 - xss는 네가 맡아라

Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Minchul Jung
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육NAVER D2 STARTUP FACTORY
 
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by NetflixJi-Woong Choi
 
Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2plusperson
 
20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)
20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)
20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)Amazon Web Services Korea
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
 
Openstack Usecase(2018)
Openstack Usecase(2018)Openstack Usecase(2018)
Openstack Usecase(2018)Gasida Seo
 
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례Gruter
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴Sanghyuk Jung
 
리스펙토링 6월 세미나, AWS로 개인서버 구축하기
리스펙토링 6월 세미나, AWS로 개인서버 구축하기리스펙토링 6월 세미나, AWS로 개인서버 구축하기
리스펙토링 6월 세미나, AWS로 개인서버 구축하기JungHoon Lee
 
Owasp top 10 2013 - 정다운 -
Owasp top 10   2013 - 정다운 -Owasp top 10   2013 - 정다운 -
Owasp top 10 2013 - 정다운 -Darion Kim
 
OWASP TOP 10 - 2013 (정다운)
OWASP TOP 10 - 2013 (정다운)OWASP TOP 10 - 2013 (정다운)
OWASP TOP 10 - 2013 (정다운)다운 정
 
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)Osc Osc
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Gruter
 
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀EXEM
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기Yungon Park
 
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena DollyJi-Woong Choi
 

Similar a Springcamp 2015 - xss는 네가 맡아라 (20)

Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
 
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
 
Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2Daejeon IT Developer Conference Struts2
Daejeon IT Developer Conference Struts2
 
20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)
20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)
20140528 AWS Meister BlackBelt - Amazon Kinesis (Korean)
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
 
Openstack Usecase(2018)
Openstack Usecase(2018)Openstack Usecase(2018)
Openstack Usecase(2018)
 
OWASP TOP 10 in 2007
OWASP TOP 10 in 2007OWASP TOP 10 in 2007
OWASP TOP 10 in 2007
 
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴
 
리스펙토링 6월 세미나, AWS로 개인서버 구축하기
리스펙토링 6월 세미나, AWS로 개인서버 구축하기리스펙토링 6월 세미나, AWS로 개인서버 구축하기
리스펙토링 6월 세미나, AWS로 개인서버 구축하기
 
Owasp top 10 2013 - 정다운 -
Owasp top 10   2013 - 정다운 -Owasp top 10   2013 - 정다운 -
Owasp top 10 2013 - 정다운 -
 
OWASP TOP 10 - 2013 (정다운)
OWASP TOP 10 - 2013 (정다운)OWASP TOP 10 - 2013 (정다운)
OWASP TOP 10 - 2013 (정다운)
 
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
[오픈소스컨설팅] Atlassian webinar 기본 트러블슈팅(1 of 2)
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014
 
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 9회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
OracleHistory3
OracleHistory3OracleHistory3
OracleHistory3
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기
 
Html5
Html5 Html5
Html5
 
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
[오픈소스컨설팅]이기종 WAS 클러스터링 솔루션- Athena Dolly
 

Springcamp 2015 - xss는 네가 맡아라

  • 1. 이 형 규 XSS는 네가 맡아라
  • 2. 2 목차 • XSS 소개 • XSS 공격 유형 • XSS 방어 방법 • Lucy-Xss-Filter 소개 • Lucy-Xss-Servlet-Filter 소개 2
  • 5. 5 XSS 란 ? • XSS 취약점은 애플리케이션이 신뢰할 수 없는 데이터를 가져와 적절한 검증 이나 제한 없이 웹브라우저로 보낼 때 발생한다. • 전 세계 시스템 공격 방법 통계에서도 XSS는 6.2%를 차지하고 있다. • SANS에서 가장 위험한 25대 소프트웨어 오류에서 4번째로 선정 • 사용자 세션 탈취, 웹사이트 변조, 악의적인 사이트로 이동할 수 있다. 5
  • 6. 6 XSS 공격 유형 1. 게시판에 특정 스크립트를 작성 한 뒤 불특정 다수가 보도록 유도 2. 스크립트가 시작하여 열람자의 쿠키 값을 가로챔 4. 공격자는 열람자의 정보로 로그 인 3. 가로챈 쿠키 값을 웹 프록시 등 을 이용하여 재전송 • 쿠키정보/세션 ID 획득 • 관리자 권한 획득 • 악성코드 다운로드 6
  • 8. 8 XSS 방어 방법 • 입, 출력 값 검증 및 무효화 • 자체 구현 • 오픈소스 라이브러리 사용 • OWASP ESAPI • Apache.commons.lang3.StringEscapeUtils • HTML PURIFIER • XSSPROTECT • XSS-HTML-FILTER 8
  • 9. 9 XSS 방어 방법 – 자체구현(전자정부 프레임워크) web.xmlHTMLTagFilter.java 9
  • 10. 10 XSS 방어 방법 – 라이브러리 사용(OWASP) 10
  • 11. 11 Lucy-Xss-Filter 소개 library Date License WhiteList Sax Parser Dom Parser Mal- formed HTML Support Easy Config xssprotect 2008.02 Apache 2.0 N N Y N N xss-html- filter n/a CC BY-SA 2.5 Y Y X Y N HTMLPuri fier 2012.01. 18 LGPL Y X Y Y Y lucy-xss- filter 2012.09. 24 Apache 2.0 Y Y Y Y Y 11
  • 12. 12 Lucy-Xss-Filter 소개 - DOM Parser, SAX Parser 방식 모두 사용 가능, 특히 SAX Parser 방식을 사용할 경우 Input String 용량 대비 3 배정도의 적은 추가 Heap 메모리 만으로도 필터링이 가능해 DOM Parser방식에 비해 동시에 많은 데이터 처리 가 능. - xml 기반의 화이트리스트 필터링 방식사용. 이미 파악된 공격 유형만 필터링 하는 블랙리스트 방식과 달리, 화이 트리스트 방식은 허용되는 내용을 제외한 모든 부분을 필터링 하기 때문에 새로운 공격 유형도 필터링 가능하다. - 화이트리스트 상위 설정 파일에 대한 상속 및 오버라이딩(overriding)이 가능하도록 구현되어 있다. 따라서, 보안 검수팀에서 제공하는 상위 설정 파일을 상속받는 것만으로도 모든 기본 보안 정책이 적용되며, 서비스에 따라 변경 이 불가피한 필터링 규칙은 하위 파일에서 재정의할 수 있어 서비스에 맞게 수정가능하다. - 기능 확장이 가능한 Element Listener, Attribute Listener 제공. 악의적인 XSS 코드를 변환/삭제하는 기능 이외 에 특정 요소에 하위 요소를 추가하거나 데이터를 변경할 수 있도록 이벤트 처리 인터페이스를 제공한다. 12
  • 13. 13 Lucy-Xss-Filter 소개 (진짜 장점...) • 한국어 문서 • 개발자가 한국어 구사 • 질의응답을 한국어로 할 수 있음 13
  • 15. 15 Lucy-Xss-Filter 소개 출처 : http://m.inven.co.kr/board/powerbbs.php?come_idx=3553&l=3 방패(Lucy-Xss-Filter) 방어주문(Lucy-Xss-Servlet-Filter) 15
  • 17. 17 Lucy-Xss-Filter 사용법 동작 그만. 네이버 오픈소스 홍보냐 ? 증거 있어 ? 이게 홍보가 아니라는 거에 내 깃헙 계정을 건다. 10 17
  • 18. 18 Lucy-Xss-Filter 사용법 • https://github.com/naver/lucy-xss-filter • http://search.maven.org/#search|ga|1|lucy-xss • 네이버 개발자 센터의 xss 프로젝트는 더 이상 관리되지 않습니다. (http://dev.naver.com/projects/lucy-xss/) 18
  • 19. 19 Lucy-Xss-Filter 사용법 • 두 가지 자바 클래스를 사용함 • XssPreventer • XssFilter • XssSaxFilter (Sax 방식) • XssFilter(Dom 방식) <dependency> <groupId>com.navercorp.lucy</groupId> <artifactId>lucy-xss</artifactId> <version>1.6.3</version> </dependency> • maven dependency 19
  • 20. 20 Lucy-Xss-Filter 사용법 - XssPreventer • Apache Common Lang3 사용 org.apache.commons.lang.Entities public void escape(Writer writer, String str) throws IOException { … if (c > 0x7F) { writer.write("&#"); writer.write(Integer.toString(c, 10)); writer.write(';'); … } org.apache.commons.lang3.text.translate.LookupTranslator public int translate(final CharSequence input, final int index, final Writer out) throws IOException { … // descend so as to get a greedy algorithm for (int i = max; i >= shortest; i--) { final CharSequence subSeq = input.subSequence(index, index + i); final CharSequence result = lookupMap.get(subSeq.toString()); … } 20
  • 21. 21 Lucy-Xss-Filter 사용법 - XssPreventer • HTML4 Entity 기준으로 문자열 escape 수행 (http://www.w3schools.com/charsets/ref_html_entities_4.asp)
  • 22. 22 Lucy-Xss-Filter 사용법 - XssPreventer 테스트 전후 결과 @Test public void testXssPreventerUnicode() { String dirty = ""><script>alert(‘xss');</script>"; String clean = XssPreventer.escape(dirty); Assert.assertEquals(clean, "&quot;&gt;&lt;script&gt;alert(&#39;xss&#39;);&lt;/script&gt;"); Assert.assertEquals(dirty, XssPreventer.unescape(clean)); } 22
  • 23. 23 Lucy-Xss-Filter 사용법 - XssSaxFilter • 웹 애플리케이션을 보호하는 기능을 화이트리스트(White List) 설정 방식으로 구현한 Java 기반의 필터 라 이브러리 23
  • 24. 24 Lucy-Xss-Filter 사용법 - XssSaxFilter SAX DOM 메모리 Input 용량(파일용량기준) 대비 8배 Input 용량(파일용량기준) 대비 18배 속도 6M HTML 1초 6M HTML 1.4초 * 중첩된 태그 깊이가 깊어지면, 속도가 심 하게 느려짐 (재귀함수 호출이 많아져서) thread safe? Yes Yes memroy leak? No No oom? Yes (ex) 1024M 가용메모리 상황에서 22 개 쓰레드에서 동시에 6M HTML을 필 터링 할 경우 OOM 발생가능) Yes (ex) 1024M 가용메모리 상황에서 9개 쓰 레드에서 동시에 6M HTML을 필터링 할 경 우 OOM 발생가능) stack overflow? No Yes • SAX vs DOM 24
  • 25. 25 Lucy-Xss-Filter 사용법 - XssSaxFilter 오픈소스 개발자 보안(공통) 관리자 서비스 개발자 • lucy-xss-default-sax.xml • Jar 파일에 포함되어 함께 배포되는 기본 설정 파일 • html element와 attribute가 정의되어 있음 • lucy-xss-superset-sax.xml • 보안 or 공통팀 담당자가 작성하는 보안 설정 파일 • 전사 공통으로 XSS 공격 필터링 여부와 패턴을 정의함 • lucy-xss-sax.xml • 서비스 담당자가 작성하는 보안 설정 파일 • 서비스에 특화된 XSS 공격 필터링 여부와 패턴을 정의함 • 위의 모든 설정을 상속받음 25
  • 26. 26 Lucy-Xss-Filter 사용법 - XssSaxFilter • 설정 방법 <elementRule> <element name="body" disable="true" /> <element name="embed" disable="true" /> <element name="iframe" disable="true" /> <element name="meta" disable="true" /> <element name="object" disable="true" /> <element name="script" disable="true" /> <element name="style" disable="true" /> <element name="link" disable="true" /> <element name="base" disable="true" /> </elementRule> <attributeRule> <attribute name="src" base64Decoding="true"> <notAllowedPattern><![CDATA[(?i:s*c*r*i*p*t*:)]]></notAllowedPattern> </attribute> </attributeRule> 26
  • 27. 27 Lucy-Xss-Filter 사용법 - XssSaxFilter • com.nhncorp.lucy.security.xss.XssSaxFilter @Test public void testDirtyCodeFiltering() throws Exception { XssSaxFilter filter = XssSaxFilter.getInstance("lucy-xss-superset-sax.xml"); String dirty = "<IMG SRC="javascript:alert!('XSS');">"; String clean = filter.doFilter(dirty); System.out.println("clean : " + clean); Assert.assertFalse("n" + dirty + "n" + clean, dirty.equals(clean)); }
  • 28. 28 Lucy-Xss-Filter 사용법 - XssSaxFilter • com.nhncorp.lucy.security.xss.event.ElementListener • 악의적인 XSS 코드를 변환/삭제하는 기능 외에 특정 요소에 하위 요소를 추가하거나 데이터를 변경해야 하는 경우가 발생할 수 있다. ElementListener는 설정 기반으로 요소를 처리할 때 이벤트를 획득하여 별도의 작업을 추가할 수 있는 기능을 제공한다. public class EmbedListener implements ElementListener { public void handleElement(Element e) { // autostart="false" 추가 e.putAttribute("autostart", ""false""); // <param> 요소 추가 e.addContent(new Element("param")); } } <element name="embed"> <!-- ElementListener 인터페이스를 구현한 클래스 이름을 기술한다. --> <listener>com.nhncorp.lucy.security.xss.test.EmbedListener</listener> </element> 28
  • 29. 29 Lucy-Xss-Filter 사용법 - XssSaxFilter • com.nhncorp.lucy.security.xss.event. AttributeListener • 특정 Attribute에 대한 이벤트 Listener 설정이다. 가령 특정 attribute에 AttributeListener를 설정하면, 모든 Element의 해당 attribute 에 대해 특정 작업을 수행할 수 있다. public void handleAttribute(Attribute attr) { if (!this.isWhiteUrl(attr.getValue())) { attr.setValue(""""); } } private boolean isWhiteUrl(String url) { … } <attributeRule> <attribute name="src"> <listener>com.nhncorp.lucy.security.xss.listener.SrcAttributeListener</listener> </attribute> </attributeRule> 29
  • 30. 30 Lucy-Xss-Filter 사용법 https://github.com/naver/lucy-xss-filter/blob/master/docs/manual/kr/01.%20summary/1.3%20selection%20criterion.md XssPreventer VS XssFilter • XssPreventer는 파라미터로 받은 문자열을 단순히 escape 하는 XSS공격 방어 라이브러리 • XssSaxFilter 는 보안에 중점을 두면서도, HTML 태그 또한 정상 동작하도록 하는 White List 방식의 XSS 공격 방어 라이브러리 즉 HTML이 아닌 단순 텍스트 파라미터에 대해서는 XssPreventer를 사용해 전체를 escape 하는 것이 올바른 대응 방법이고 게시판, 메일, 방명록 등 HTML 태그 기능이 필요한 서비스는 XssSaxFilter를 사용해 필터링 하 는 것이 효과적인 방법이므로 개발자는 두 가지 상황을 고려해 방어 라이브러리를 사용해야 한다. 마지막으로 사용자 입력데이터가 뷰에 다시 노출시킬 목적이 아닌 Business Logic에만 쓰이는 데이터일 경우에 는 둘 다 사용하지 말아야 한다. 불필요한 eacape/unescape이 발생해 원본데이터가 훼손될 수 있다. 30
  • 31. 31 Lucy-Xss-Servlet-Filter 소개 이런 노력에도 불 구하고 여전히 XSS공격을 뿌리 뽑을 순 없었 습니다... 31
  • 34. 34 Lucy-Xss-Servlet-Filter 소개 • XSS 공격만 걸러내는 Filter를 만들어 서블릿으로 데이터가 전달되는 길목에 서 사전에 XSS 공격을 필터링 하기로 함 드루와 드루와 34
  • 35. 35 Lucy-Xss-Servlet-Filter 소개 XSS 공격 방어 체크를 누락 하여 보안에 허점 발생 필터링 대상이 아닌데 XSS Filter 를 적용하여 서비스 성능에 저하 입력 데이터 중 HTML이 있 음 개발하기도 바쁜데 일일히 신경쓰기 싫다. • 하지만 여전히 문제는 존재함 35
  • 36. 36 Lucy-Xss-Servlet-Filter 소개 • 상황별 Filter를 선택 가능한 설정 제공 • XssPreventer • XssSaxFilter • XssDomFilter • 필터링을 제외할 수 있는 설정 제공 • URL • Prefix • Name 36
  • 37. 37 Lucy-Xss-Servlet-Filter 사용법 • maven dependency <dependency> <groupId>com.navercorp.lucy</groupId> <artifactId>lucy-xss-servlet</artifactId> <version>1.0.2</version> </dependency> • web.xml <filter> <filter-name>requestParamFilter</filter-name> <filter-class>com.naver.service.filter.requestparam.RequestParamFilter</filter-class> </filter> <filter-mapping> <filter-name>requestParamFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> • 아직 github 공개 전 ... 조만간 예정되어 있음 37
  • 38. 38 Lucy-Xss-Servlet-Filter 사용법 <config xmlns="http://www.navercorp.com/request-param"> <defenders> <defender> <name>preventer</name> <class>com.naver.service.filter.requestparam.defender.XssPreventerDefender</class> </defender> </defenders> … <default> <defender>preventer</defender> </default> <global> <params> <param name="q" useDefender="false" /> <param name="globalprefix3" usePrefix="true" useDefender="false" /> </params> </global> … <url-rule-set> <url-rule> <url>/search.nhn</url> <params> <param name="query" useDefender="false" /> </params> <url disable="true">/disabletest1.nhn</url> </url-rule> </url-rule-set> </config> … 38
  • 39. 39 Lucy-Xss-Servlet-Filter 장단점 • XML 설정 만으로 XSS 방어가 가능해짐 • 코드 수정이 발생하지 않음 • 개발자가 XSS 방어를 신경 쓰지 않아도 됨 • XSS 방어가 누락되지 않음 • 설정 파일 하나로 XSS 방어절차가 파악됨 • 파라메터명에 대해 관리가 필요해짐 • 일괄 적용되어 영향 받기 때문에 사전 설계가 중요함 39
  • 40. 40 Lucy-Xss-Servlet-Filter 장단점 • XML 설정 만으로 XSS 방어가 가능해짐 • 코드 수정이 발생하지 않음 • 개발자가 XSS 방어를 신경 쓰지 않아도 됨 • XSS 방어가 누락되지 않음 • 설정 파일 하나로 XSS 방어절차가 파악됨 • 파라메터명에 대해 관리가 필요해짐 • 일괄 적용되어 영향 받기 때문에 사전 설계가 중요함 신규로 개발하는 서비스에는 lucy-xss-servlet-filter를 사용하는 것을 추천하지만 기존 잘 운영되는 시스템에 lucy-xss-servlet-filter를 사용하는 것은 추천하지 않습니다. 입력 파 라메터가 전부 필터링 되기 때문에 의도치 않은 결과가 발생할 수 있기 때문입니다. 기존 시스템에 적용하시려면 lucy-xss-filter를 사용해 일일히 필터링 하는 방식을 추천드 립니다. 하지만 테스트 시간 확보가 충분히 되신다거나 기존에 서블릿 필터 기반으로 XSS 공격을 방어하셨다면 이번 기회에 lucy-xss-servlet-filter를 적용해 XSS 공격에서 해방되시는 것 도 나쁘지는 않습니다. 39
  • 41. 41 오픈소스 아직 부족한 점이 많습니다. 사용자 분들의 contribution(bug reporting, bug fix, proposal) 을 환영합니다. ^^ 40
  • 42. 42 참고문헌 • 한국인터넷진흥원 (http://www.kisa.or.kr/uploadfile/201312/201312161355109566.pdf) • OWASP (https://www.owasp.org/images/2/2c/OWASP_Top_10_-_2013_Final_-_Korean.pdf) • 정보보안개론(http://www.hanbit.co.kr/preview/1331/sample_chap5.pdf) 41
  • 43. 43 어때요 끝 월요일엔 아마 바쁘지 않을까 화요일도 성급해 보이지 안 그래 수요일은 뭔가 어정쩡한 느낌 목요일은 그냥 내가 왠지 싫어 우~ 이번 주 금요일 우~ 금요일에 시간 어때요 Github 에서 만나요 Star를 눌러 주세요 42

Notas del editor

  1. 안녕하세요 ~ 저는 XSS 공격 방어 라이브러리를 소개하러 나온 네이버 랩스 이형규 입니다. 
  2. 발표순서는 XSS 공격에 대해서 간단 소개 후 방어 방법에 대해서 소개하려 합니다.  마지막으로 네이버에서 사용하는 XSS 방어용 오픈소스 라이브러리에 대해서 소개를 하고 끝마치겠습니다.  (30초)
  3. 2010, 2013년도에 OWASP에서 10대 웹 취약점 보고서를 발간하였는데요  OWASP는 10대 웹 취약점을 발표하고 이에 대한 대응방안을 안내하는 프로젝트이자 단체인데요 3년 주기로 보안상 영향을 크게 줄 수 있는 10가지를 선정해 발표하고 있습니다.   XSS 공격은 2010년도에는 2번째에 랭크되어 있고, 2013년도에는 3번째에 랭크되어 있는데요.  이 표만봐도 아주 위험도가 높다는 것을 알 수 있죠, 나쁜 녀석들 중 탑이라고 할 수 있습니다.     (30초)   
  4. 이번엔 표로 좀 더 자세히 알아보겠습니다.  이 표는 XSS 공격에 대해 5가지 항목을 기준으로 접근해 만들어진 표 입니다. 차근차근 보시죠 이 공격은 내외부 사용자 모두 가능합니다. 그리고 공격 가능성 등급은 평균인데요 상중하로 봤을 때 중이라고 생각하면 됩니다.  공격 방식이 어렵지 않단 얘기죠, 취약점의 분포는 아주 넓습니다. 사용자 입출력 폼이 있는 페이지라면 어디서든 발생 가능합니다.  이 공격의 탐지는 쉽습니다. 테스트나 코드 분석 단계에서 쉽게 탐지 가능합니다. 탐지는 쉽지만 탐지해야할 양이 많은 거 같습니다.  영향도도 상중하로 봤을 때 중간입니다. 이 취약점이 운영 중인 서비스에 발견이 되었다면 사업적 영향을 고려해야 한다고 적혀 있습니다.  비즈니스에 영향을 받는다는 말이겠죠  (40초)
  5. XSS 공격의 서술적 정의에 대해서 알아보겠습니다.  XSS 취약점은 애플리케이션이 신뢰할 수 없는 데이터를 가져와 적절한 검증이나 제한 없이 웹브라우저로 보낼 때 발생한다. 전 세계 시스템 공격 방법에서 6.2 퍼센트를 차지하고 있다. SANS에서 가장 위험한 25대 소프트웨어 오류에서 4번째로 선정되었으며  사용자의 세션탈취, 웹사이트 변조, 악의적인 사이트로 이동할 수 있다 라고 정의되어 있습니다.   (30초)   
  6. 이번엔 일반적인 XSS 공격 방식에 대해 알아보겠습니다.  공격자는 게시판에 특정 스크립트를 작성한 뒤 이 스크립트를 다수의 사용자가 보도록 합니다.  다른 사용자가 이 게시물을 보면 스크립트가 시작되어 열람자의 쿠키 값을 가로챕니다. 노출된 쿠키 정보는 공격자에게 전달됩니다.  공격자는 열람자의 개인정보를 얻어 열람자의 정보로 로그인이 가능해 집니다.  이런 식으로 공격 유형은 저장, 반사, Dom 공격이 있습니다.  이런 공격으로 공격자는 쿠키나 세션정보를 취득이 가능해집니다.  아주 무서운 공격이죠  그럼 이런 무서운 XSS 공격을 막기위한 방어 방법에는 무엇이 있을까요 (40초)
  7. 첫번째 기도입니다.  기도의 힘으로 공격을 막습니다.  열심히 기도를 하면 공격자가 공격을 안할 수도 있습니다. 
  8. 두번째는 직접 구현한 라이브러리로 입 출력 값을 검증해 공격 코드를 무효화 하는 방법이 있습니다.  세번째는 기존에 나와있는 오픈소스 라이브러리를 사용 하는 방법입니다.  한번 예를 들어보겠습니다. (30초)
  9. 자체 구현한 라이브러리 인데요, 전자정부 프레임워크에 들어있는 방어 패턴입니다.  코드를 보시면 HttpServletRequestWrapper 를 활용해 getParameterValues를 override 해서  request에서 getParameter가 호출될 때마다  html로 인식이 될만한 문자들을 html entity로 변환하고 있습니다.  web.xml 디플로이 디스크립트에 do로 호출될 때마다 HTMLTagFIlter라는 자체 구현한 필터를 타도록 설정을해   xss 공격이 발생하지 않도록 모든 문자열을 변환하고 있습니다.  xss 공격을 막기위해 아주아주 심플하며 강력한 방법입니다. 그런데 단점도 있습니다. 모 아니면 도 식 방어방법인데요  예를들면 필터링을 할 필요가 없는 request도 필터링이 됩니다. 내부에서만 사용하는 안전한 url일 경우에도 필터링을 해야하고  그리고 사용자 입력 데이터로 html을 받아야 한다면 이런 방식이라면 html이 전부 깨지게 됩니다. (60초)
  10. 그 다음 방어 방법으로 다른 유명한 오픈소스 라이브러리를 활용하는 방법인데요 개인적으론 OWASP 라이브러리가 가장 신뢰합니다.  아무래도 XSS 공격의 유형을 정의하고 방어 방법 또한 가이드하는 곳이니까요  이 표는 8가지 공격 패턴과 방어 방법을 보여주고 있습니다.  방어 패턴으로 HTML entity encoding, URL encoding, 유효성 검사, white list 기반의 속성, 입력값 정규화, 16진수 인코딩, 헥스 인코딩, 유니코드 인코딩, whiltel list 기반의 url 등등을 안내하고 있습니다. 공격 유형과 방어 유형을 굉장히 세분화해서 가이드해주고 있습니다.  이전에 일괄적으로 필터를 적용해 단순 html entity encoding을 수행한 전자정부 프레임워크와는 다른 점은  크게 필터로 인한 일괄적용이 아닌 개발자가 직접 api를  호출해 방어를 해야 한다는 점입니다.  그리고 다른 기능의 유무는 XSS 방어에 크게 영향을 미치지 않는데 HTML validation은 이 기능을 지원함으로써 사용자 입력 데이터로 html을 받는 것도 가능합니다.  한단계 더 진보된 라이브러리라 할 수 있죠  (90초)    
  11. 그 외에 오픈소스들도 많은데 이번엔 저희가 사용하는 lucy-xss-filter와 한번 표로 비교해보겠습니다. 저희가 XSS 공격 방어 라이브러리로 가장 중요하다고 생각하는 점은 White list를 지원하느냐, Sax Parser를 지원하느냐 입니다.  White list를 지원하지 않으면  공격자의 패턴을 미리 알지 못 한다면 계속 공격자 의도에 끌려다닐 수 밖에 없습니다.  그리고 Sax Parser를 지원하지 않으면 성능저하가 우려됩니다. 근데 이것도 사용자로 부터 입력받는 데이터가 보통 적으니 문제가  되진 않습니다만... 사용자가 입력 폼에 html을 작성해 꾸미는 서비스라면 oom을 고려하셔야 합니다.  저희는 메일, 카페, 블로그 등등의 서비스를 하기 때문에 고려를 해야했습니다. 그리고 whitelist 설정방식이 수월해야 했습니다. 이 두가지 방식을 지원하는 오픈소스 라이브러리가 없었고  단순히 entity encoding 수준이 아닌 특정 태그나 속성일 경우 추가적인 작업을 해야하는 경우도 있기 때문에  저희는 새로운 라이브러리의  개발의 필요성을 느껴 자체 개발하게 되었습니다.   그런데 이렇게 말하니까 뭔가 대단한게 있어보이는데요 ... 마이크로한 라이브러리 입니다.  (90초) 
  12. lucy-xss-filter는 Dom과 Sax방식을 지원해 데이터 성격별로 적용이 가능해 oom 발생 가능성을 대폭 줄였습니다.  xml 기반의 화이트리스트 필터링 방식이기 때문에 설정이 쉽고 설정이 된 패턴만 통과시키기 때문에 새로운 공격의 유형에도 대응이 가능합니다. 설정 파일간 상속이 가능해 오픈소스 개발자 -> 회사 내 보안부서, 공통 담당자 -> 서비스 담당자 별로 이어지는 설정이 가능합니다.  저희는 세 개의 팀에서 오픈소스 개발자는 통과가 가능한 html 태그를 정의하구요,  회사 내 보안부서는 통과가 가능한 html 태그 속성에 대해 전사적으로 적용해야 할 통과가 가능한 패턴을 정의합니다. 실질적인 보안의 시작인 곳이죠 마지막 서비스 담당자가 본인의 서비스에 더 특화된 패턴이 있거나 무시해도 될 패턴이 있다면 추가적으로 설정 파일을 작성해 XSS 공격을 필터링 합니다.  마지막으로 악의적인 XSS 코드를 변환/삭제 하는 기능 이외에 다른 더 복잡한 처리를 가능하도록 이벤트 리스너를 제공합니다.  물론 장점만 나열하긴 했지만 단점도 있습니다.  단점은 다른 라이브러리와 비교했을 경우는 찾기 힘든 데 OWASP와 비교했을 경우에 굳이 꼽자면 있습니다.  제가 생각하는 단점은 OWASP처럼 XSS 공격이 발생 가능한 모든 유형에 대해 특화된 방어 방식을 적용하고 있지는 않습니다.  하지만 이 점은 이벤트 리스너로 대체가 가능하다고 보고 있고 그리고 향후에 OwASP의 방향을 가이드 삼아 더 발전시키고자 합니다. (100초) 
  13. 그런데 제가 생각하는 진짜 장점은 이겁니다. 한글 문서 되어있구요, 개발자가 한글을 구사합니다. 그리고 질의응답을 한글로 할 수 있습니다.  사실 이게 제일 장점이죠  보통 개발자들이 서비스를 만드는데 XSS 공격은 크게 신경쓰지 않습니다.  그런데 이 공격을 막기 위해 영어로 된 문서의 양이나 가이드 양이 만만치는 않습니다.  이 외국인도 영어가 중급이랍니다... 기능더 더 많고 편하게 사용이 가능하고 게다가 국문 가이드인데 굳이 다른 걸 쓸 이유는 없지 않을까요 ? (50초) 
  14. 장점에 대해서 확실히 인식이 되셨을테니 본격적 소개를 하도록 하겠습니다.  그 동안 네이버는 많은 XSS 공격을 받았고 이렇게 많은 기사가 언론에 보도되었습니다.  아무래도 네이버를 공격의 대상으로 많이들 삼고 있고 지금 이순간에도 많은 공격을 받고 있습니다.  (30초)
  15. 이렇게 많은 공격을 받으면서 네이버도 대응을 하고 있습니다.  네이버에서 사용하는 라이브러리는 lucy-xss-filter와 lucy-xss-servlet-filter 두 가지가 있습니다.  lucy-xss-filter가 어플리케이션 곳곳에서 개별로 XSS 공격을 막기위해 사용하는 방패라면  lucy-xss-servlet-filter는 어플리케이션 전체에 XSS 공격을 막아주는 방어주문입니다. (30초) 
  16. 이번에 발표를 준비하면서 한 번 lucy-xss-filter를 웹에서 검색해봤습니다.  여기저기서 많이 소개되었고 사용되고 있는 걸 확인할 수 있었습니다. 이 분은 책의 저자시구요 개인 블로그에 소개되었습니다.  학원에서도 사용되고 있고 이 쪽은 뽐뿌 사이트인데 저도 이 글을 보고 좀 놀랐습니다.  위키에서도 소개되구 있었구요 은근히 많이 사용되고 있습니다.  아마 대부분 이 자리에서 처음 접하셔서 최근에 오픈된 줄 아시는 분들도 많을텐데요  실제로 3년 전쯤에 네이버 개발자 센터에 오픈되어있던 오픈소스 입니다.  네이버 개발자 센터에서는 더 이상 관리도 힘들고 방문객도 더 이상 찾아오지 않아 깃헙으로 이전하게 되었습니다. (50초) 
  17. 단순 홍보만 위해서 나온 자리는 아니구요, 노하우 공유의 목적이 더 큽니다.  KSUG 운영진들이 단순 홍보는 안된다고 가이드를 주더군요 (20초)   
  18. 위의 깃헙 주소로 오시면 lucy-xss-filter 프로젝트가 보입니다.  참고로 네이버 개발자 센터의 XSS 프로젝트는 더 이상 관리되지 않습니다. 커뮤니케이션은 깃헙으로만 합니다. 그리고 보시는 것처럼 메이븐 센트럴에도 배포되어 있습니다. (30초)  
  19. Lucy-xss-filter에서 사용하는 클래스는 XssPreventer와 XssFilter 총 2개 입니다. 여기서 좀 더 구체화된 클래스를 선택해 SAX, DOM 방식이냐를 선택하지만 크게는 두 가지입니다. dependency 설정이구요 현재 1.6.3 까지 나와있습니다.  (20초)  
  20. XssPreventer는 내부적으로 apache-common-lang3을 사용합니다.  사실 이런 방식의 필터링은 초창기 lucy의 메인 기능이 아니였는데  저희가 이 라이브러리를 굳이 xssfilter 안으로 가져오게 된 이유는 실제로 서비스를 할 때 가장 많이 필요한 기능은 단순히 사용자 입력 데이터를  html entity 엔코딩만 하는 경우가 많습니다. 아까 전에 전자정부 방식처럼요  기존 lucy-xss-filter를 사용했을 경우 xml 설정도 필요해 원하는 작업 결과에 비해 해야할 일이 복잡했습니다. 그러다보니 단순 치환에도 이런 설정 작업이 필요할까요 라는 요구사항을 받았고 xss의 모든 요소를 커버한다는 목표 아래 apache-common-lang3을 활용해 해당 기능을 넣게 되었습니다. apache-common-lang을 사용하시면 유니코드인 한글이 깨질 수도 있습니다.  이 부분이 깨지는 부분인데요  integer를 string으로 변경하고 있씁니다. 이게 apache-common-lan3에서는  변환하지 않고 map에 담긴 value에 담긴 키에 해당하는 value를 가져오는 부분으로 변경되었습니다.  그래서 apache common lang 라이브러리를 사용하셔야 한다면 lan3을 사용하시는 걸 추천 드립니다.   (70초)
  21. apache-common-lang3의 escapeHTML이란 메소드를 사용하시면 아래 나와있는 HTML4 기준대로  CHAR 를 Entity 로 치환하게 됩니다.  여러 분들이 알고 있는 것과 다르지 않습니다. (20초) 
  22. 이 코드는 깃헙으로 오시면 프로젝트 테스트 코드에 다 들어있습니다.  api사용법은 아주 심플합니다. xss 공격의 요소가 들어있는 오염된 문자열을 XssPreventer.escape란 메소드를 호출해서 xss 공격 요소가 삭제된 문자열로 변경할 수 있습니다. 테스트 성공했구요 결과 한번 보시죠   사용자의 입력값이 단순 텍스트 파라메터라면 이 메소드를 사용하시면 됩니다.  (100초)
  23. 이번에 소개드릴 건 xssfilter 입니다.  whitelist 설정 방식으로 구현한 필터 라이브러리 입니다.  전에 설명한대로 XssFilter는 Dom이냐 Sax냐에 따라 사용하는 클래스가 다릅니다.  이 자리에서는 가장 많이 사용하는 XssSaxFilter 위주로 소개드리겠습니다.  작동 방식은 둘 다 동일한데요  white list로 접근이 허용될 html 태그들을 설정합니다. 그 설정 정보를 읽어들여 Filter core에 저장이 되고  XSS  공격이 들어오게 되면 Filter가 HTML을 마크업 파서에게 전달합니다.  그럼 마크업 파서는 html 태그들을 Filter 라이브러리가 이해할 수 있는 구조로 내부에서 정의한 규칙대로 재생성합니다. 재생성된 html 태그들은 Filter를 통해 Xss 공격 여부를 탐지하게 되고 XSS 공격 요소가 제거된 채로 어플리케이션으로 되돌아가게 됩니다.  (100초) 
  24. sax 방식과 dom 방식 파서의 성능 비교표를 보시면 메모리 사용량이 DOM 이 너무 많습니다. 속도도 좀 더 걸리구요  그 외에 thread safe 여부는 둘 다 trhead safe 하고 메모리 누수현상은 없습니다.  문제는 oom 인데 DOM 방식이 oom 발생 기준이 훨씬 낮습니다.  아 그런데 이건 대량의 html 데이터를 사용자에게 입력을 받는 경우 입니다. 사실 이런 서비스는 국내에 많지는 않을 거 같습니다.  dom은 초기 lucy-xss-filter 버전에서 사용되던 방식이구요 저희 서비스에서 대용량 html 발생하였고 oom 이 발생하였씁니다. 그 뒤 SAX 방식이 추가되었습니다. 아 그리고 sax 방식의 xss 필터 라이브러리는 특허가 걸려있습니다. 특허청 가시면 확인하실 수 있습니다. dom의 장점도 있습니다. 성능은 sax 에 비해 느리지만 특정 태그에서 와야할 속성들에 대해 체크가 가능합니다. 그런데 이 부분은 엄밀히 말하면 xss 필터의 역할은 아닙니다. 그래서 저는 sax 방식의 사용을 추천드립니다.     (100초) 
  25. XssSaxFilter를 사용하기 위해서는 세 가지 설정 파일이 있습니다.  첫째는 오픈소스 개발자들이 정의하는 lucy-xss-default.xml 입니다.  이 파일에는 html 태그와 속성정보들이 설정됩니다. 여기에 설정되지 않는 html 태그나 속성은 xss filter를 통과할 수 없습니다. html4, 5 의 태그와 속성들이 적히게 됩니다.  이 파일은 jar 파일에 포함되어 함께 배포가 되며 서비스 개발자 분들이 수정할 일은 없습니다.  두번 째 설정파일은 lucy-xss-superset.xml 입니다. 먼저 이 파일은 lucy-xss-default 파일의 설정을 상속을 받습니다.  이 파일의 용도는 모든 프로젝트나 모든 개발팀이 따라야 할 XSS 공격 패턴을 정의합니다. 실질적인 공통 설정 파일인 셈이지요 이 파일은 네이버에서는 보안팀이 작성하고 있습니다. 보안팀이나 프로젝트 공통팀 공통 관리자가 설정하면 될 거 같습니다. 세 번째 설정 파일은 lucy-xss-sax.xml 입니다. 다른 파일과 마찬가지로 모든 파일을 상속 받습니다. 공통 설정 외에 서비스 담당자가 서비스에 특화시켜 추가로 설정해야 할 게 있다면 추가하거나  공통 설정이 여기엔 맞지 않다 덮어씌울 수 있습니다.  만약 설정 파일이 누락되어있다면 상위 설정 파일을 자동으로 읽어들이게 되니  서비스에서 특별하게 설정하게 없다면 무시하시면 됩니다.  첫번째 설정 파일은 여러 분들이 고려하실 이유가 없으니 신경 안쓰셔도 되구요  두번째와 세번째 파일을 적절히 설정하신다면 설정만으로 XSS 공격에 대해 효과적으로 방어하실 수 있습니다. (120초)
  26. 예시 설정 파일은 네이버에서 많이 사용하고 있는 설정 파일입니다. 오픈소스 개발자가 작성하는 설정 파일에 HTML4, 5 태그 요소를 정의해두었으니 추가 설정을 하지 않으면 해당 태그들은 통과가 될 겁니다. 실질적으로 html 태그들을 정의한 거지 필터링을 하는 단계로 볼 수 없습니다.  그래서 추가적인 설정이 필요합니다. 이 설정 파일은  공통이나 보안 담당자가 관리하는 파일이 될 수도 있고  서비스 개발자가 최종적으로 설정한 파일이 될 수 있습니다. 어느 위치에 있어도 상관이 없습니다.  크게 두 가지로 나뉘는데 HTML의 요소인 element와 attribute를 설정합니다.  이런 element 명을 가진 태그들을 diable 시킬거냐 html entity encoding을 시키겠다는 의미입니다.  이것보다 더 복잡한 설정이 가능하지만 예를들면 상위 파일에 작성된 설정을 상속을 받을 것인지 해당 엘레먼트의 특정 어트리뷰트 endTag가 존재하는지, removeTag 설정을 할 것인지 엔코딩 이벤트 발생 시 동작할 리스너를 동작시킬 것인지 이런 기능들이 있습니다. 문서를 보시면 더 자세히 알 수 있습니다.  아래의 attributeRule은 태그의  attribute 값에 대한 필터링 규칙을 정의합니다.  name에 해당하는 attribute에 대한 입력이 가능한 패턴과 불가능한 패턴을 정의할 수 있습니다.  exceptionTagList 설정은 전체 attribute에 대한 설정이 아닌 특정 태그안의 attribute만 적용하고 싶은 경우 사용하고 Base64Decoding 설정도 추가할 수 있습니다.  (120초) 
  27. 마찬가지로 예제 코드 입니다.  XssSaxFilter의 인스턴스를 생성할 때 필터링 규칙을 가진 white list 설정 파일이 주어지게 됩니다.  XSS로 오염된 문자열이 있구요 filter에 태우면 깨끗해진 문자열이 나오게 됩니다. 한번 직접 보겠습니다. 무설정, element 설정, attribute 설정  (300초)
  28. XML 설정이 아닌 코드레벨의 지원 기능도 있습니다. elementlistener 입니다.  특정 element일 경우에 XSS공격 코드 외에 추가적인 작업을 할 수도 있습니다. 그럴경우 elementListener의 HandleElement 메소드를 구현하시면 됩니다.  그리고 기존에 설정 파일에 element 부분에 listener 태그를 추가작성하시면 해당 태그가 filter로 들어오는 순간 사용자가 정의한 작업을 수행합니다.
  29. element에 관한 리스너 말고도 attribute에 대한 리스너도 있습니다. AttributeListener 입니다. handleAttribute와 isWhiteUrl 메소드를 구현하시면 특정 attribute에 대해 추가적인 작업을 더 정의하실 수 있습니다. 마찬가지로 설정 방법은 기존 설정 파일 arrtibuteRule 부분에 listenr을 선언하시면 됩니다.  아주 간단하게 설정되고 다른 라이브러리에는 없는 강력한 기능입니다.  이 기능으로 라이브러리가 가진 본연의 기능 외에 사용자가 원하는 다양한 작업의 수행이 가능해집니다. 
  30. 지금까지 lucy-xss-filter의 대표 기능 두 가지를 수행하는 XssPreventer와 XssFilter의 설명을 드렸습니다.  처음 접하게 되면 이 두 가지 클래스가 XSS공격을 제거한다는 건 알겠는데  왜 두 가지가 필요할까 ? 차이점은 무엇일까? 나는 어떤 클래스를 사용해야 하나? 라는 의구심이 드는데요  이 점을 많은 개발자분들이 혼란스러워 하셨습니다. 그래서 한 장에 다시 한번 정리를 해봤습니다.  •XssPreventer는 파라미터로 받은 문자열을 단순히 escape 하는 XSS공격 방어 라이브러리 •XssSaxFilter 는 보안에 중점을 두면서도, HTML 태그 또한 정상 동작하도록 하는 White List 방식의 XSS 공격 방어 라이브러리 입니다.  이 말은 단순 텍스트 파라미터에 대해서는 XssPreventer를 사용해 전체를 escape 하는 것이 올바른 대응 방법이고  게시판, 메일, 방명록 등 HTML 태그 기능이 필요한 서비스는 XssSaxFilter를 사용해 필터링 하는 것이 효과적인 방법이므로  개발자는 두 가지 상황을 고려해 방어 라이브러리를 사용해야 한다. 물론 XssSaxFilter로 모든 기능의 수행이 가능합니다. 하지만 작업의 효율과 비즈니스의 성격을 고려해 더 라이트한 api가 XssPreventer인 것이죠  다시 한번 말하면 담당하시는 서비스에 사용자 입력 값으로 html 데이터를 허용하는지 입니다. 허용한다면 XssSaxFilter를 사용하셔야 되고 허용하지 않는다면 XssPreventer로 충분합니다.  (150초) 
  31. 자 그럼 이런 라이브러리의 등장으로 모든 XSS 공격에 대해 방어가 가능할까요 ? 안타깝게도 아니었습니다. 이런 노력에도 불구하고 XSS 공격은 여전히 우리를 위협했습니다.  (30초) 
  32. 여전히 네이버는 XSS 공격에 시달렸구요. 언론의 보도는 큰 부담이었습니다.  기존의 해결방법으로는 부족해 추가적인 문제 해결 방법이 필요해진 상황이었습니다. 사실 해결 방법은 제약을 더 가하는 방법이기 때문에 내부에서 찬반이 많이 갈렸었습니다.  그런데 뭐 어쩌겠습니까 위에서 시키면 해야죠  (30초)
  33. 왜 이런 문제가 발생했는지 조사를 해봤습니다.  조사를 해보니 다구리엔 장사가 없는거죠  공격을 막을 수 있는 방패를 생겼지만 방패를 사용하지 않은 거죠  사용자에 의한 누락이 발생하는 겁니다. 왜 누락이 발생하느냐  사용자의 입력 폼이 너무 많다. 비즈니스 코드에 일일히 방어 코드를 심는게 불가능하다.  방어 기능은 강력하지만 휴먼 에러로 인한 누락이 발생할 수 밖에 없다라는 결론을 얻었씁니다. 그리고 사실 서비스 개발도 시간이 부족한데 이런 부분까지 신경쓰기엔 여유가 없는거죠 (50초)
  34. 저희 팀이 아닌 역으로 서비스 팀에서 의견을 받았고 라이브러리를 개발하게 됩니다.  XSS 공격만 걸러내는 Filter를 만들어 서블릿으로 데이터가 전달되는 길목에서 사전에 XSS 공격을 필터링 하는 방식을 택한겁니다.  이렇게 하게 되면 개발자는 XSS 공격을 신경쓰지 않고 비즈니스 코드에서는 XSS 공격 코드가 사라지게 됩니다.  초반에 설명드렸던 전자정부 프레임워크의 구현방식을 택한 겁니다.  (30초)
  35. 이렇게 강제적으로 filter에서 모든 request 파라메터를 필터링을 수행하는 건  의도치 않은 결과를 발생시킬 수 있기 때문에 호불호가 명확하게 갈리는 방식입니다.  많은 개발회사나 팀에서 이런 서블릿 필터 방식을 택하고 있을겁니다. 필터링 대상 문자열이나  규칙을 필터로 등록하는거죠 이런 방식을 저는 개인적으로 많이 봤습니다.  이런 방식이 장점은 있지만 문제도 있습니다. 장점으로는 전에 말씀 드렸던 이 두 가지 단점으로는 입력 데이터 중 HTML 있다면 어떻게 해야하나 ? 필터링 대상이 아닌데 XSS 필터링을 수행하게 되니 성능 저하도 염려가 되고 아무래도 필터링 대상이 아닌데 필터링을 수행한다는게 여간 껄끄러운 건 아닙니다.  (50초) 
  36. 그래서 저희는 이런 단점을 타개하기 위해서  들어오는 입력 데이터는 무조건 필터링을 하자  입력 데이터를 필터링 하는 필터는 세 가지를 전부 지원한다.  들어오는 입력 데이터는 무조건 필터링 하는 게 원칙이지만 제외할 수 있는 옵션도 다양하게 제공하자  왜냐하면 XSS 요소에 대해 정의가 잘 되어있다면 불필요한 필터링을 수행할 필요는 없습니다.  정의를 잘되어있다면 최소한의 간단한 설정만으로 필터링을 제외할 수 있는 다양한 기능이 필요합니다. safe한 url로 들어오는 request는 필터링 하지 않는다던지  prefix를 설정하면 해당 prefix로 설정하는 파라메터들은 필터링 하지 않는다던지  특정 Name의 파라메터면 필터링을 하지 않는다던지  이 기능들은  실제로 서비스팀에 초창기 적용을 해보면서 발생한 모든 문제점에 대해 손쉽게 대응할 수 있는 필터링 옵션을 계속해서 추가한 것입니다. 아마 대부분의 문제점에 대응할 수 있을 것입니다.  (70초) 
  37. 이 라이브러리는 아직 깃헙에는 공개가 안되어있는데요  조만간 리패키징 후 공개를 할 예정입니다. 현재 사내에서는 1.0.2 버전까지 나와서 사용 중입니다.  오픈 후에 이 라이브러리를 다운 받으신 후 web.xml에 filter 설정을 하시면 끝입니다.  (30초) 
  38. xml 설정 예입니다.  세 종류 중 어떤 필터를 선택하실 지 정의가 가능합니다. default로 사용할 필터도 설정 가능하구요  global이란 설정을 통해 어플리케이션 전체에 적용할 설정이 가능합니다.  주로 XSS공격이 들어올 수 없는 특정 파라메터 명을 설정해 필터링을 제외시킨다던지  prefix를 설정해 해당 name로 시작하는 모든 파라메터는 필터링을 제외시킨다던지  이런 부분이 글로벌로 설정이 가능합니다.  그리고 url 별 설정도 가능합니다.  특정 url의 모든 파라메터는 필터링에서 제외한다던지  특정 url의 특정 파라메터만 필터링에서 제외한다던지 특정 url의 prefix로 시작하는 파라메터들은 필터링에서 제외한다던지 특정 url에는 사용하고 싶은 filter를 선택가능 합니다. (70초) 
  39. 이 라이브러리까지 추가 사용했을 경우의 장단점 입니다.  xml 설정 만으로 xss 방어가 가능해짐 코드 수정이 발생하지 않음 -  개발자가 xss 방어를 신경 쓰지 않아도 됨 xss 방어가 누락되지 않음 설정 파일 하나로 xss 방어 절차가 파악됨 여기까지가 장점이구요 단점은 파라메터 명에 대해 관리가 필요해짐, 파라메터 명에 따라 필터링 여부가 결정되기 때문에 파라메터를 개발자 임의대로 선언하실 수 없습니다. 초기 설계 시 명에 대해 규칙 정의가 필요합니다.  아무래도 모든 파라메터가 xss 공격 필터링 대상이 되기 때문에 강력한 보안기능을 제공하지만  파라메터의 벨류가 영향을 받는건 예상치 못한 결과를 가져오실 수 있기 때문에 초반에 테스트를 꼭 해보셔야 됩니다.  물론 단점도 있지만 사실 생각해보면 저 위의 단점들은 굳이 xss 공격이 아니더라도 코드 유지보수를 용이하게 하기 위해서 필요한 작업들입니다. 그러니 저는 위의 관리들은 해야할 필요가 있다는 입장인 거구요  그리고 일반 개발자 입장에서는 이런 작업은 어차피 프로젝트 리딩하시는 분들이 하실테니 그 분들에게 맡기시고  XSS 공격에서 해방되시는게 훨씬 낫지 않나요 ??? 물론 리딩하시는 분들은 추가적인 일거리가 생기신 겁니다.  하지만 그 분들도 더 이상 XSS 공격을 신경쓰지 않아도 된다는 점 그리고 XSS 설정에 대해서 xml 파일 하나로 파악이 가능하다는 점  이 장점에 더 주목하는게 맞을 거 같습니다.  솔직히 번거롭다고는 하지만 코드에 일일히 xss 방어 코드 넣는게 더 힘듭니다. ;;;  (120초)
  40. 이 라이브러리까지 추가 사용했을 경우의 장단점 입니다.  xml 설정 만으로 xss 방어가 가능해짐 코드 수정이 발생하지 않음 -  개발자가 xss 방어를 신경 쓰지 않아도 됨 xss 방어가 누락되지 않음 설정 파일 하나로 xss 방어 절차가 파악됨 여기까지가 장점이구요 단점은 파라메터 명에 대해 관리가 필요해짐, 파라메터 명에 따라 필터링 여부가 결정되기 때문에 파라메터를 개발자 임의대로 선언하실 수 없습니다. 초기 설계 시 명에 대해 규칙 정의가 필요합니다.  아무래도 모든 파라메터가 xss 공격 필터링 대상이 되기 때문에 강력한 보안기능을 제공하지만  파라메터의 벨류가 영향을 받는건 예상치 못한 결과를 가져오실 수 있기 때문에 초반에 테스트를 꼭 해보셔야 됩니다.  물론 단점도 있지만 사실 생각해보면 저 위의 단점들은 굳이 xss 공격이 아니더라도 코드 유지보수를 용이하게 하기 위해서 필요한 작업들입니다. 그러니 저는 위의 관리들은 해야할 필요가 있다는 입장인 거구요  그리고 일반 개발자 입장에서는 이런 작업은 어차피 프로젝트 리딩하시는 분들이 하실테니 그 분들에게 맡기시고  XSS 공격에서 해방되시는게 훨씬 낫지 않나요 ??? 물론 리딩하시는 분들은 추가적인 일거리가 생기신 겁니다.  하지만 그 분들도 더 이상 XSS 공격을 신경쓰지 않아도 된다는 점 그리고 XSS 설정에 대해서 xml 파일 하나로 파악이 가능하다는 점  이 장점에 더 주목하는게 맞을 거 같습니다.  솔직히 번거롭다고는 하지만 코드에 일일히 xss 방어 코드 넣는게 더 힘듭니다. ;;;  (120초)
  41. 요거는 제가 여러분들게 요청하고 싶은 내용입니다. 오픈 소스 프로젝트 인데 아직 부족한 점이 많습니다. 여러 분들의 컨트리뷰션 버그레포팅 버그 픽스 제안등등 모든 컨트리뷰션을 환영한다는 점 여러 분들에게 말씀드리고 싶었구요  다들 이 플젝을 회사 업무로 하기 보다는 업무 외 시간에 하시는 분들입니다. 혹시나 대응이 늦어도 양해 부탁드립니다.  (40초)
  42. 참고 문헌입니다.  개인적으로는 맨 위에 한국인터넷 진흥원 자료를 강추합니다. 아주 자세하게 나와있더라구요 owasp 자료까지 합쳐지 상태로 (25초)
  43. 마무리 입니다.  오셔서 star를 눌러주시면 저희도 더 힘이 나구요 ㅎ 회사에 당당히 말을 할 수 있습니다. 이 일 먼저 해야 합니다라고 ... 오셔서 눌러주시면 감사하겠습니다.  그리고 이 노래는  아이유의 금요일에 만나요 란 노래인데요  저희는 굳이 만날 필욘 없을 거 같구 깃헙에서 만났으면 합니다.  마지막으로 여러 분들이 오늘 기억하실 건 사용방법s 거 아닙니다.  XSS 공격에 시달리셨다면, XSS 공격을 막는데 효과적인 라이브러리가 있다라는 점 알고 가시면 됩니다.  어차피 문서화는 잘되어 있으니 나중에 깃헙 오셔서 확인하시면 됩니다.  감사합니다.  (60초)