NOTE: 너무 길어서 좀 나눌까 생각중입니다. 귀찮으면 그냥 둘 예정; -민규
0. OVERVIEW
0.1. What is vulnerability
In computer security, a vulnerability is a weakness which allows an attacker to reduce a system’s information assurance. from https://en.wikipedia.org/wiki/Vulnerability_(computing)
In short, a weakness is in theory, a vulnerability is in practice.
0.2. Guidelines
- 행정안전부 시큐어코딩 가이드 (Secure Coding Guide)
- CWE (Mitre’s Common Weakness Enumeration) Top 25 cf)CVE(Common Vulnerability Exposure)
- OWASP Top 10 vulnerabilities
- CERT (Secure Coding Standard)
0.4. Mitigate Vulnerability Strategy
- Network Layer : Traffic, Packet monitoring
- App Op Layer : Request, pattern monitoring
- App Dev Layer : Secure Coding (What we are dealing with)
0.5. Microsoft Security Development Lifecycle:MSSDL
MS SDL: DREAD
MS SDL: STRIDE
Definition
Mitigation
0.6. 보안관련 Encoding
- URL Encoding : URL에 사용할 수 있는 형태로 encoding
- HTML Encoding : 브라우저 렌더링 escape
- SO Difference between Url Encode and HTML encode
0.7. KISA SW보안약점 카테고리 7개
- 입력데이터 검증 및 표현 : SQL Injection, XSS
- 보안기능 : Weak Cryptographic Algorithm
- 시간 및 상태 : TOCTOU
- 에러처리
- 코드오류
- 캡슐화
- API오용
하나의 Attack은 위 7개 카테고리를 복합적으로 사용할 수 있음.
0.8 보안관련툴
- Proxy : Paros 1 , Fiddler 2 , Charles 3 , Burp Suite 4
- SQL Injection : Pangolin 5
- Toolbar for IE : Cooxie Toolbar 6
- Integrated penetration testing tool : ZAP 7
- Backtrack 11
1. 입력데이터 검증 및 표현
1.1. SQL Injection
MySQL Injection Example
' union select 1,2,3,4,5,6 #
' union select schema_name,2,3,4,5,6 from information_schema.schemata#
' union select table_name,2,3,4,5,6 from information_schema.tables where table_schema = database()#
' union select group_concat(column_name),2,3,4,5,6 from information_schema.columns where table_name = '테이블명'#
pangoline 4 같은 툴을 사용하면 일일이 손으로 공격값을 넣을 필요없음
How to mitigate SQL Injection
- Use static query
- Use PreparedStatement properly when using JDBC API
- Use # in My/IBatis query
- In case of dynamic query, use a proper filter to remove/replace special characters which enable attacks
1.2. Access Control 경로조작 및 자원 삽입
주어진 권한을 넘어서는 리소스 탈취/수정
How to mitigate Access Control Attack
- Application에게 과도한 권한을 주지 말 것: root, administrator 사용금지
- Application내에서 whitelist, input string validation 등 수행
1.3. Cross Site Script (XSS)
클라이언트 대상 해킹기법으로 악성코드를 클라이언트에서 실행시켜 원하는 데이터를 탈취함.
Type (regarding where malicious script originated)
Stored XSS
Reflected XSS
DOM XSS
How to mitigate XSS
- Use JSTL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
....
<c:out value="${board.content}" />
....
or
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
....
<${fn:escapeXml(board.content)}
....
- Use 3rt party library such as Lucy XssPreventer/XssFilter : https://github.com/naver/lucy-xss-filter
String dirty = "\"><script>alert('xss');</script>";
String clean = XssPreventer.escape(dirty); //"><script>alert('xss');</script>
String dirty = "<img src=\"<img src=1\\ onerror=alert(1234)>\" onerror=\"alert('XSS')\">";
String clean = filter.doFilter(dirty); //<img src=\"\"><!-- Not Allowed Attribute Filtered ( onerror=alert(1234)) --><img src=1\\>\" onerror=\"alert('XSS')\">
- Spring Framework인 경우, Filter 사용 : http://www.openeg.co.kr/383
Examples above is too basic. Consult link below for smarter attacks
OWASP Cheat Sheet : https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
And here’s a first hand experience of “Mass SQL Injection”
1.4. Malicious File Upload
- 웹에서 직접 접근이 불가능한 위치에 파일 업로드 할 것
- 사용자가 올린 파일명과 저장된 물리적 파일명을 다르게 할 것 (둘 사이의 연결 정보 관리필요)
- 실행가능한 파일 업로드 불가
- 파일을 업로드하면서 weakness를 모두 없애는 것은 쉽지 않다
1.5. 신뢰되지 않는 URL주소로 Redirect
- 피싱에 쓰이는 기법, 사용자가 인지하지 못하도록 공격싸이트로 이동시켜서 정보 탈취
How to mitigate
- URL주소를 whitelist로 관리할 것
- 적절하게 encode 할 것
1.6. XPath Injection
- SQL Injection과 유사.
- XML문서를 검색하는 입력값을 이용하여 공격
- 방어방법은 XQuery 클래스를 사용 (PreparedStatement와 유사)
1.7. LDAP Injection
- 검색어);추가정보; : 검색어 정보와 추가정보가 함께 조회됨
- 검증되지 않은 입력값 검증 필요
1.8. Cross Site Request Forgery (CSRF)
사용자로 하여금 공격자가 의도한 요청을 서버로 보내 처리하도록 하는 공격 누군가 보내준 링크를 클릭했더니 페이스북에 광고글(썬글래스)이 게시된다든지 하는 시나리오 (내가 안올렸는데)
일베의 적 일간워스트 개발자가 싸이트를 리뉴얼하는 동안 일워싸이트를 페북글쓰기로 리다이렉션을 걸어놓았는데, 일베사용자들이 페이스북에 로그인된 상태에서 악성댓글을 달다가 일베인증을 한 적이 있다. 바람직한 CSRF예
How to mitigate CSRF
- 정적 소스코드 진단으로는 검출되지 않으며, 동적진단을 통해 검출해야한다
- Verify requests even from authorized users : CSRF TOKEN으로 실제 시나리오상의 요청인지 검증
- 사용자에게 실제 요청의 의도를 다시 확인한다 : 홍길동에게 100만원을 이체하시겠습니까?
- USE captcha : https://www.google.com/recaptcha
- discussion about captcha : https://gist.github.com/homakov/5607607
1.9. HTTP 응답 분할 (HTTP Response Splitting)
- OWASP : https://www.owasp.org/index.php/HTTP_Response_Splitting
- JDK 1.6 이상에서는 해결되었다? 확인필요
- MITRE 참조 : https://cwe.mitre.org/data/definitions/113.html
1.10. 정수형 오버플로우 Integer overflow
- OWASP : https://www.owasp.org/index.php/Integer_overflow
- Java는 Integer overflow가 발생하지 않는다. 연산오류가 있을 뿐. http://www.mkyong.com/java/javas-silent-killer-buffer-overflow-careful/
Android Stagefright Vulnerability
- Blog : https://blog.zimperium.com/the-latest-on-stagefright-cve-2015-1538-exploit-is-now-available-for-testing-purposes/
- Demo : https://www.youtube.com/watch?v=PxQc5gOHnKs
- CVE-2015-1538
- http://fortune.com/2015/07/28/stagefright-google-android-security/
1.11. 메모리 버퍼 오버플로우 Memory buffer overflow
- http://www.openeg.co.kr/331
- Java와 C#처럼 managed code를 사용하는 언어는 관계없음
1.12. Format String
- 포맷스트링 함수를 이용한 공격
- 이것도 Java와 C#처럼 managed code를 사용하는 언어는 관계없음
2. 보안기능
2.1. Cripytography
- http://seed.kisa.or.kr/iwt/ko/index.do
- 인터넷진흥원(KISA) 암호정책수립기준
Java Cryptography Architecture(JCA)
The Java Cryptography Architecture (JCA) is a framework for working with cryptography using the Java programming language.
Java Cryptography Extension(JCE)
The Java Cryptography Extension (JCE) is an officially released Standard Extension to the Java Platform. JCE provides a framework and implementation for encryption, key generation and key agreement, and Message Authentication Code (MAC) algorithms.
Bouncy Castle
2.2. 안전하지 않은 난수 Crpytographically insecure random number
Javascript
Java
- java.util.Random < java.security.SecureRandom
- Difference between random and securerandom
2.3. 쿠키관련 취약점 : download
- setHttpOnly
- setSecure: SSL/TLS 통신을 강제함
- setPath
2.4. Read from buffer
아래와 같이 버퍼크기를 지정해서 가져오는 것을 권고
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) >= 0){
for (int i = 0; i < bytesRead; i++){
//Do whatever you need with the bytes here
}
}
2.5. Brute Force Attack 막무가내 공격
- application 수준에서 BFA를 막기는 쉽지 않음.
- 공격의 타겟이 될 수 있는 외부로 열려있는 기능은 throughput 제한을 두거나 세션별 최대 요청수 등을 관리할 수는 있음
Burp Suite
Burp Suite is an integrated platform for performing security testing of web applications. Its various tools work seamlessly together to support the entire testing process, from initial mapping and analysis of an application’s attack surface, through to finding and exploiting security vulnerabilities.
2.6. Race Condition
경쟁조건 : 검사시점과 사용시점TOCOUT (Time of check, time of use)
2.7. 에러처리
Java Exception
Throwable
Error -> system abort
Exception
Checked Exception -> Compiler
*Runtime Exception* -> Problematic
오류메시지를 통한 정보 노출
e.printStackTrace();
위 코드는 정적분석도구로 스캔하면 취약점으로 검색됨. 하지만, 웹시스템에서 위 코드는 콘솔창으로 오류스택을 내보내므로 오류메시지가 노출된다고 할 수 없음. 웹시스템인 경우 분석도구에서 예외처리 필요.
2.8. Null dereference, Null pointer 역참조…
A null-pointer dereference takes place when a pointer with a value of NULL is used as though it pointed to a valid memory area. https://www.owasp.org/index.php/Null_Dereference
int c1 = 5;
int* p1 = &c1; //p1 references c1 p1은 c1을 참조한다
int n1 = (*p1); //*p1 dereferences p1 to yield c1 *p1은 p1를 역참조한다 (뭔소리여 @_@)
The expression *p1 dereferences p1 to yield c1 as an lvalue
다시 말해서, *p1은 p1을 역참조한다는 말은 포인터인 p1이 참조하고 있는 c1의 값(여기서는 5)을 가지고 온다는 뜻. 역참조라는 말은 개인적으로 안썼으면 좋겠다.
그나저나, Java는 pointer가 없는데 왠 Null pointer 역참조? NullPointerException이랑 관련이 있는건가? KISA에서 얘기하고 있는 Null pointer 역참조는 아래 내용. CERT에서는 역참조~~따위의~~와 같은 혼란스런 단어를 쓰지 않고 깔끔하게 “Do not use a null in a case where an object is required”로 정리했다.
Do not use a null in a case where an object is required
객체가 null이 아닐꺼라고 간주하지 말라.
그렇다면, 모든 객체를 매번 null체크 하란 말? obj != null && 아 손꾸락 아퍼
2.9. Memory leak
Avoid memory leak and callback
tl;dr
7. API 오용 (엉? 3,4,5,6 다 어디갔지?)
7.1. DNS lookup에 의존한 보안결정
- DNS lookup/resolution : 도메인으로 IP를 찾는 것
- Reverse DNS lookup/resolution : IP로 도메인을 찾는 것. 공격자에 의해 hostname이 변조될 수 있음
- CWE-350: Reliance on Reverse DNS Resolution for a Security-Critical Action
When the software performs a reverse DNS resolution for an IP address, if an attacker controls the server for that IP address, then the attacker can cause the server to return an arbitrary hostname. As a result, the attacker may be able to bypass authentication, cause the wrong hostname to be recorded in log files to hide activities, or perform other attacks.
Attackers can spoof DNS names by either (1) compromising a DNS server and modifying its records (sometimes called DNS cache poisoning), or (2) having legitimate control over a DNS server associated with their IP address.
String ip = request.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip);
if (addr.getCanonicalHostName().endsWith("trustme.com")) {
trusted = true;
}
InetAddress의 getCannonicalHostName을 authentication용으로 사용하지 말것.
7.2. 취약한 API 사용
8. 정적분석툴 Static Source Code Analysis Tools
Yasca
Findbugs
SK Nextcore Code Inspector
Fasoo sparrow
9. Conclusion (IMHO)
DO NOT BELIEVE ANYONE
CONSIDER USER AS ATTACKER
INPUT VALUES ARE EVIL
- 개발자 관점에서 secure coding은 정도의 문제.
- “보안”과 “가독성/성능” 의 trade-off 관계에서 적절한 선을 긋는 것이 중요.
- 적절한 선이 어디인지가 전쟁터.
9. miscellaneous
KISA Secure Coding 진단원 과정이 있음
인증관련
Mitre corporation
- Homepage
- [Wikipedia]https://en.wikipedia.org/wiki/Mitre_Corporation
- [Meaning and proper Pronounciation]http://www.oxforddictionaries.com/definition/english/mitre
Qualys SSL Test
Wehshell : 웹상에서 서버 CLI를 사용하도록 해주는 툴
- http://darksoulstory.tistory.com/324
- https://www.trustwave.com/Resources/SpiderLabs-Blog/Hiding-Webshell-Backdoor-Code-in-Image-Files/
SpringFramework Request Flow
HSQLDB: http://hsqldb.org/
- HSQLDB (HyperSQL DataBase) is the leading SQL relational database software written in Java. It offers a small, fast multithreaded and transactional database engine with in-memory and disk-based tables and supports embedded and server modes. It includes a powerful command line SQL tool and simple GUI query tools.
- Benchmark: http://hsqldb.org/PolePosition.pdf
OWASP Webgoat Project
- WebGoat is a deliberately insecure web application maintained by OWASP designed to teach web application security lessons. You can install and practice with WebGoat in either J2EE (this page) or WebGoat for .Net in ASP.NET. In each lesson, users must demonstrate their understanding of a security issue by exploiting a real vulnerability in the WebGoat applications. For example, in one of the lessons the user must use SQL injection to steal fake credit card numbers. The application is a realistic teaching environment, providing users with hints and code to further explain the lesson.
- https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project
CC(Common Criteria)인증이란?
정보보호시스템 평가인증 지침
KISA 공개용 소스코드 보안약점 분석도구 개발 동향 PDF
10. Footnotes
아래는 자바 8 관련인데 귀찮아서 여기 남김. 나중에 따로 포스팅 나누겠습니다.
- https://github.com/winterbe/java8-tutorial
- http://winterbe.com/java/