본문 바로가기

Hacking & Security/Web

소스코드 점검기준 & 취약점 - 2

소스코드 점검기준 & 취약점 - 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();
}