목록DEV&OPS (244)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Unsafe Reflection 안전하지 않은 리플렉션 동적 클래스 loading시 외부의 입력을 사용할 경우, 공격자가 외부 입력을 변조하여 의도하지 않은 클래스가 로딩되도록 할 수 있습니다. 방어 방법 외부의 입력을 직접 클래스 이름으로 사용하지 말고, white 리스트에서 클래스 이름을 선택하도록 합니다. 안전하지 않은 코드의 예 String type = props.getProperty("type"); Worker w; try{ Class workClass = Class.forName(type + "Worker"); w = (Worker) workClass.newInstance(); w.doAction(); }catch (ClassNotFoundException e) { …… } 5라인 에서 외부입..
Process Control 프로세스 제어 정의 신뢰되지 않는 소스나 환경에서 라이브러리를 적재하거나 명령을 실행하면 악의적인 코드가 실행될 수 있습니다. 방어 방법 라이브러리를 적재할 때 절대 경로를 사용합니다. 안전하지 않은 코드의 예 public void loadLibrary() throws Exception{ //외부 라이브러리 호출 시 절대 경로를 사용하지 않고 있습니다. Runtime.getRuntime().loadLibrary("libraryName"); } 안전한 코드의 예 public void loadLibrary() throws Exception{ //외부 라이브러리 호출 시 절대 경로를 지정합니다. Runtime.getRuntime().loadLibrary("/usr/lib/libra..
Eval Injection 동적으로 생성되어 수행되는 명령어 주입 정의 외부 입력이 동적으로 스크립트나 명령어 생성에 사용될 경우 의도하지 않은 명령어가 외부부터 주입되어 문제를 일으킬 수 있습니다. 방어 방법 외부의 입력이 eval()함수의 인자로 사용될 경우 위험 문자를 제거합니다. ESAPI for javascript 등 보안 API를 이용하여 외부에서 입력되는 값을 검증한 후 사용합니다. 안전하지 않은 코드의 예 외부 입력 evalParam이 eval()함수의 인자로 사용되고 있습니다. 안전한 코드의 예
Improper Neutralization of Script-Related HTML Tags in a Web Page 크로스 사이트 스크립트 공격 취약점 정의 외부에서 입력되는 스크립트 문자열이 웹 페이지 생성에 사용되면 생성된 웹페이지를 열람하는 사용자에게 피해를 입힐 수 있습니다. 방어 방법 jsp의 document.write() 같은 DOM 객체 출력을 수행하는 메소드의 인자 값으로 외부 입력을 사용하면 위험한 문자를 제거해야 합니다. 보안성이 검증된 API를 사용하여 위험 문자열을 제거하십시오. 안전하지 않은 코드의 예 document.write("name:"+); 외부 입력을 그대로 이용하고 있습니다. 안전한 코드의 예
External Control of System or Configuration Setting 시스템 또는 구성 설정의 외부 제어 정의 시스템 설정이나 구성 설정을 외부에서 제어 가능하게 하면 예상치 못하게 악용 가능성이 있습니다. 방어 방법 외부 입력을 화이트 리스트 방식으로 검사한 후 사용합니다. 안전하지 않은 코드의 예 private final String COMMAND_PARAM = "command"; private final String CHANGE_FTP_PORT = "change_service_port"; priavte final String PORT_PARAM = "port"; //생략 protected void doPost(HttpServletRequest request, HttpServl..
SQL Injection: mybatis Data Map 정의 외부 입력 값이 SQL 의 인자값으로만 사용되지 않고 문자열로 연결되는 값으로 사용되면 SQL문에 Injection 되어 의도하지 않은 동작을 할 수 있게 됩니다. 방어 방법 외부 입력 값에 대해 안전하지 않은 문자열을 제거하도록 합니다. mybatis Data Map 에 문자열 삽입 인자($...$)를 사용하지 말고 ## 형태를 사용합니다. 안전하지 않은 예 DELETE STUDENTS WHERE NUM = #num# AND name = '$name$' $name$ 으로 전달되는 값에 ' OR 'x' = 'x' 를 외부 입력으로 전달되면 where조건이 항상 실행하게 할 수 있습니다. 안전한 코드의 예 DELETE STUDENTS WHERE..
Reliance on Untrusted Inputs in a SecurityDecision 보호 메커니즘을 우회할 수 있는 입력값 변조 정의 공격자는 다양한 방법을 통해 입력값(쿠키,환경변수,히든필드 등)을 조작할 수 있고 조작된 내용은 탐지되지 않을 수 있습니다. 따라서, 인증이나 인가 같은 보안 결정이 이런 입력값들을 기반으로 수행되면 보안을 우회할 수 있으므로 충분한 암호화 무결성 체크 등이 없는 경우 외부 입력값을 신뢰해서는 안됩니다. 방어 방법 상태 정보나 민감 데이터, 세션 정보 같은 중요한 정보는 서버에 저장하고 보안 절차도 서버에서 실행합니다. 안전하지 않은 예 Cookie[] cookies = request.getCookies(); for(int i = 0; i < cookies.leng..
정수 오버플로우 java 에서 허용한 큰 정수 값보다 더 커지면 의도하지 않게 작은 수 이거나 음수가 될 수 있습니다. 정수형 변수를 연산에 사용하는 경우 결과값의 범위를 체크하는 모듈을 사용합니다. 안전하지 않은 예 //생략 int size = new Integer(args[0]).intValue(); size += new Integer(args[1]).intValue(); MyClass[] data = new MyClass[size]; //생략 배열의 값이 오버플로우되어 음수가 되면 배열의 크기가 음수가 되어 문제가 생길 수 있습니다. 동적 메모리 할당을 위해 배열의 크기를 사용하는 경우 그 값이 음수인지 아닌지 검사하는 문장이 필요합니다. 안전한 코드의 예 //생략 int size = new Int..
HTTP Response Splitting(HTTP 응답 분할) HTTP request에 들어있는 인자값이 HTTP response header에 포함되어 사용자에게 다시 전달 될 때, 입력값에 CR(캐리지리턴), LF(라인피드)같은 줄바꿈 문자가 존재하면 response가 2개 이상으로 분리될 수 있는데, 공격자가 첫번째 응답을 종료시키고 두 번째 응답에 악의적인 코드를 주입해서 XSS 및 캐시를 훼손하는 공격 등을 할 수 있습니다. 외부 입력값을 HTTP response의 응답 헤더(Set Cookie 등)에 포함시킬 경우 CR, LF를 제거하거하거나 오작동을 일으킬만한 소지가 있는 문자들을 제거하여 방어합니다. 안전하지 않은 예 //생략 response.setContentType("text/html..
Path Traversal 디렉토리 경로 조작 상대 디렉토리 경로 조작(Relative Path Traversal) 외부 입력으로 디렉터리 경로 문자열 생성이 필요한 경우 외부 입력을 필터링 하지 않으면 시스템 경로 조작이나 시스템 정보 유출, 장애, 권한 획득 등을 유발할 수 있습니다. 외부 입력에 대해서 다른 디렉터리 파일에 접근 할 수 없도록 replaceAll() 등을 이용하여 위험한 물자열(", / \ 등)을 제거해서 방어합니다. 외부 입력은 받더라도 내부 처리는 미리 정의해 놓은 데이터(경로)를 사용합니다. 안전하지 않은 예 public void accessFile(Properties request){ ... String name = request.getProperty("filename"); ..
Cross-Site Request Forgery 사용자가 인지하지 못한 상황에서 사용자 의도와는 무관한 공격자의 행위를 요청하게 하는 공격을 말합니다. 사용자의 세션이 특정 동작을 수행해도 계속 유지되어 정상요청과 비정상요청을 구분하지 못하는 점을 악용합니다. GET방식은 URL에 추가적인 정보를 덧붙일 수 있으므로 CSRF 공격에 노출 될 수 있습니다. 입력 폼(form) 작성시 GET보다는 POST로 전달하고 입력 폼과 서버측 프로그램 사이에 토큰을 사용하여 공격자의 직접적인 URL 사용이 동작하지 않도록 처리하여 방어합니다. 중요한 기능은 세션검증과 재인증을 유도합니다. 안전하지 않은 예 ... ... ... post를 사용하여 방어 ... ... ... 참고 http://cwe.mitre.org/..
URL Redirection to Untrusted Site 사용자의 입력값을 외부 사이트 주소로 사용해서 자동으로 연결하는 서버 프로그램은 피싱 공격에 취약점이 있습니다. 자동 연결할 외부 사이트의 URL은 화이트 리스트로 관리해서 방어합니다. 안전하지 않은 예 ... String url = request.getParameter("url"); response.sendRedirect(url); ... 안전한 예 //다른 사이트로 이동하는 URL 화이트 리스트를 만든다. String allowURL[] = {"https://url1.com", "https://url2.com", "https://url3.com"}; String nurl = request.getParameter("nurl"); try{ In..
Unrestricted Upload of File with Dangerous Type(위험한 형식 파일 업로드) 서버측에서 실행할 수 있는 파일(asp, jsp, php 등) 이 업로드 가능할 때, 이 파일을 이용해 시스템 내부 명령어를 실행하여 공격하는 방법입니다. 업로드하는 파일의 유효성 검사로 방어합니다. white list 확장자만 업로드 합니다. 업로드 디렉토리를 웹서버의 다큐먼트 외부에 설정합니다. 파일 실행 권한을 설정할 수 있는 경우 실행 권한을 제거합니다. 안전한 코드의 예 ... public void upload(HttpServletRequest request) throws SevletException{ MultipartHttpServletRequest mRequest = (Multip..
OS Command Injection 사용자 입력값에 운영체제 명령어를 넣어서 실행하는 경우 시스템을 직접 공격할 수 있습니다. 그래서 외부 입력 값을 그대로 시스템 내부 명령어로 사용하지 않아야 합니다. 만약 명령을 실행해야 하는 경우 미리 명령어 생성에 필요한 값들을 지정해놓고 외부 입력을 참고하여 사용합니다. 아래 예제는 cmd.exe 를 사용하여 rmanDB.bat 배치 명령을 실행하여 외부 입력값인 dir_type을 인자 로 사용하는 경우 입니다. ... String version = props.getProperty("dir_type"); String cmd = new String("cmd.exe /K \"rmanDB.bat \""); Runtime.getRuntime().exec(cmd + "..
Cross-site Scripting 악의적인 스크립트로 정보 유츨등 공격을 할 수 있습니다. 사용자 입력 문자열에서 , &, "," 등을 <, >, &, "로 치환해 방어합니다. HTML 태그를 허용하는 게시판에서는 허용하는 태그(white list)를 선정 한 후 허용된 태그만 허용하는 방식을 사용합니다. 보안 검증이 되어 있는 API를 사용해야 합니다. 아래 예제는 name 이라는 입력 값에 스크립트 (예: 를 수행하게 하여 쿠키 정보 유출 등 피해를 줄 수 있게 됩니다. NAME: replaceAll() 메소드로 위험한 문자를 교체합니다. OSWASP(http://Https://www.owasp.org/index.php/Esapi)에서 제공하는 보안 API를 사용합니다. J2E..