소스코드 점검기준 & 취약점 - 2
Incorrect Permission assignment for Critical Resource
특정 리소스(파일, 디렉터리)에 대한 권한을 기본값으로 할당하는 경우 임의의 사용자가 파일 읽기, 쓰기, 실행 등을 통해 수정 및 삭제의 문제를 가질 수 있다.
아래의 경우에는 시스템의 기본 설정 값으로
umask 0
값을 사용하는 경우 생성하는/home
디렉터리의 권한은 777(rwxrwxrwx)로 할당이 된다. 즉, 누구든지 읽고 편집하고 삭제할 수 있기에 취약점을 갖는다.... function createUserDir($username) { $path = '/home/'.$username; if(!mkdir($path)) { return false; } } ...
Use of Potentially Dangerous Function
개발 언어에서 사용되는 취약한 함수들의 사용으로 인한 잠재적 위험성을 가진 취약점을 의미한다.
아래에서 사용된
strcpy()
함수는 입력값에 대한 길이 검증을 하지 않고 입력 값 전체를 버퍼에 복사하는BOF
취약점이 존재하여 사용을 권고하지 않는다.void manipulate_string(char *string) { char buf[24]; strcpy(buf, string); ... }
Use of Broken or Risky Cryptographic Algorithm
취약한 암호화 알고리즘을 사용하는 경우, 주요정보 노출의 위험성을 의미한다.
아래의 경우 취약한 알고리즘인 DES 알고리즘을 사용하는 예시이다.
... Cipher des = Cipher.getInstance('DES...'); des.initEncrypt(key2); ...
Imporper Restriction of Excessive authentication attempts
계속적인 인증 공격 시도(Brute Force)에 대한 접근제어 기능을 제공하지 않는 경우를 의미한다.
아래의 경우, 입력받은 계정과 암호의 존재여부를 확인하는 로그인 처리 과정의 일부 코드인데, 로그인 시도공격에 대한 방어코드가 존재하지 않는 예시이다.
... String username = request.getParameter('username'); String password = request.getParameter('password'); int authResult = authenticateUser(username, password); ...
URL Redirection to Untursted Site
페이지에서 제공되는 다른 도메인으로의 분기 기능은 피싱사이트로의 유도 위험성이 존재하기 때문에 사용상 주의를 해야 한다.
아래의 경우, 특정 파라미터(url)에 외부도메인을 연결시켜 이동시키는 취약점을 가지고 있다.
http://example.com/example.php/url=http://malicious.example.com
... $redirect_url = $_GET['url']; header("Location: " .$redirect_url); ...
Format String Bug(FSB)
%x, %p, %n
과 같은 포맷 스트링이 일반적으로 사용된다.예를 들어,
printf("%d", i)
와 같이 사용하면 변수 i에 저장되어 있는 값을 출력하나,
printf("%x")
처럼 변수 어버ㅓㅅ이 사용하게 될 경우, 메모리의 값들을 순서대로 출력해주기 때문에 메모리 구조 파악이 가능ㅎ다ㅏ.또한
%n
포맷 스트링을 이용하면 특정 메모리 위치의 값을 다른 값으로 변경이 가능하기 때문에FSB
취약점을 이용한exploit code
작성에 필수적으로 사용된다.아래의 2번 라인은 str 문자열을 출력하도록 한 것이며, 3번째 라인 도한 동일하다.
그러나 각종 포맷 스트링을 삽입하여 프로그램의 흐름을 변경할 수 있는 취약점이 존재한다.
... printf("%s", str); printf(buf); ...
Integer Overflow
정수값에 대한 연산 오류로 인한 취약점이다.
255 + 1 = 256인 것이 당연하지만. 데이터 타입에 따라 에상관느 다르게 255 + 1 = 0 혹은 0 -1 = 65535처럼 전혀 의도치 않은 값이 출력될 수 있다.
아래의 경우에는
byte
타입의 변수data
(byte 타입 범위 : -128 ~ 127)를 선언하고 있으며,
SecureRandom
함수로 랜덤한 수를 생성하고 +1 을 진행한다.그러나 랜덤한 수가
byte
타입의 경계값이 되고, 만일 여기에 +1을 진행한다면Integer Overflow
같은 문제가 발생할 수 있다.byte data; SecureRandom r = new SecureRandom(); data = r.nextInt(); byte result = (byte)(data + 1); IO.WriteLine('reuslt: ' + reseult);
Use of a One-Way Hash without a Salt
Salt
값을 사용하지 않고 해쉬 알고리즘을 사용하는 경우, 사전에 알려진 단어들에 대한 해쉬값을 미리 만들어 두고 크랙을 원하는 해쉬값과 비교하여 원문을 취득하는Rainbow Attack
에 취약할 수 있다.아래의 경우 해시 함수로
SHA
알고리즘을 사용하고 있으나,Salt
값을 사용하지 않아Rainbow Attack
에 취약할 수 있다.String plainText = new String(plainTextIn); MessageDigest encer = MessageDigest.getInstance("SHA"); encer.update(plainTextIn); byte[] digest = password.digest(); if(equal(digest, secret_password())) { login_user(); }
'Hacking & Security > Web' 카테고리의 다른 글
웹 취약점 점검기준 - Injection (0) | 2020.01.07 |
---|---|
SQL Injection - 1 (0) | 2019.12.30 |
소스코드 점검기준 & 취약점 - 1 (0) | 2019.12.27 |
운영체제 명령 실행 취약점 진단 (1) | 2019.03.03 |
웹 취약점 진단제거 가이드 (0) | 2019.03.03 |