기본 콘텐츠로 건너뛰기

BEAST Attack

BEAST Attack

이 TLS 1.0에서 TLS 1.1로 업그레이드되는 과정 중 중요한 변화로 초기화 벡터(IV)가 CBC 모드에서 계산되는 방식을 꼽을 수 있다. 초기화 벡터(IV)는 무엇일까.

TLS는 공개 채널을 통한 암호화 키의 안전한 교환을 위한 사양으로 키 교환이 끝나면(대칭 암호화를 대신하여) 전송된 데이터의 보안을 유지한다. 대칭 암호화 알고리즘은 이제 한물간 방식이라고 평가되지만, 초기화 백터(IV)의 중요성을 이해하는 데 좋은 사례이다. 대칭 암호화 알고리즘의 대표적인 DES 알고리즘을 간단히 알아보면 블록 암호화 알고리즘으로 고정된 크기의 데이터 블록에서 동작한다는 특징이 있다. 암호화 키(8 바이트)와 함께 8 바이트의 평문을 입력 받아 8 바이트의 암호문을 출력한다. 이 암호문을 공개적으로 전송하여도 암호화 키를 모른다면 원본 문자열로 복구할 수 없으므로 안심할 수 있다. 이와 같이 모든 블록 암호는 정확하게 블록 크기에서 동작한다. 만약 데이터가 부족한 경우 쓰레기 데이터를 채워 넣어서 블록의 크기를 맞춰준다.

블록 암호의 한 가지 문제점은 결정적이라는 것이다. 예를 들어 8 바이트 문자열 sendhelp와 8 바이트 키 password가 주어지면 모든 DES 구현체들은 8 바이트 암호문 df a1 16 88 92 5c ad 78를 생성한다. 이는 모든 블록 암호화 알고리즘의 자연스러운 특징으로 복호화를 위해서 이러한 예측이 가능해야하며 다른 키를 사용한다면 전혀 다른 암호문을 생성한다는 사실을 확인할 수 있다.

동일한 키를 사용하여 동일한 8 바이트 데이터를 암호화하면 출력된 암호문이 동일하다는 점을 공격자는 어떻게 악용할 수 있을까. 생각보다 컴퓨터 통신은 상당히 반복적인 경향이 있다. HTML 문서를 떠올려보자. 얼마나 많은 반복적인 8 바이트 시퀀스들이 있는지 (Ex. <div><div>)

하나의 가설을 세워보자. 댄은 밥이 자신의 아내 킴벌리와 바람을 피우고 있다고 의심한다. 모튼 통신 내용은 암호화하여 전달되지만, 댄은 밥이 편지를 항상 Dearest로 시작한다는 것을 알고 있다. 그래서 댄은 밥이 Dearest Kimberly로 시작하는 편지를 보내는 것이 아닌 지 알고 싶어한다. 우연히 킴벌리의 이름은 정확히 8 바이트이지만, 댄은 암호화 키(password)를 예측할 수 없다.

밥이 편지를 작성하여 보낼 때, 첫 번째 블록인 Dearestf9 1b d5 c2 f6 42 2e 42로 암호화된다. 두 번째 블록인 Kimberly94 04 8d d0 ca 9f f9 9c로 암호화한다.

댄은 암호를 추측하는 것 대신 밥이 보낸 두 번째 블록을 보고 밥을 속여 Kimberly를 전송하고 출력을 관찰한다. 이전에 관찰된 두 번째 암호화 블록과 일치하면 Kimberly에게 보냈다는 것을 알 수 있게 된다.

블록 암호화 알고리즘에서 이러한 문제는 오랜 시간 고민되어졌고 이제는 CBC(Cipher Block Chaining)이라는 보편적인 방어법이 존재한다. 바로 이전 블록과 XOR 연산을 하는 것이다. (XOR은 복호화 시간에 영향을 최소화하는 좋은 방법이다.) 이때 첫 번째 블록은 XOR 연산을 수행할 대상이 없으므로 초기화 벡터(IV) 값을 추가하게 된다. 초기화 벡터(IV)에 관련된 TLS 1.0과 TLS 1.1의 주요 차이점은 TLS 1.0에서 초기화 벡터(IV) 값은 실제로 비밀로 간주되어 암호화 키와 동일하게 처리된다는 점이다. 그래서 키 협상과 초기화 벡터(IV) 협상을 같이 진행했다. 이 방식은 2002년 Phil Rogaway가 결함을 문서화하기 전 까지 모두가 안전하다고 생각하였다.

데이터 전송을 위해서 CBC 모드와 TLS 데이터를 전송 가능한 덩어리로 분할하게 된다. 1000 바이트 메시지는 송신을 위해 10 개의 100 바이트 패킷으로 분할 될 수 있으며 각각의 개별 SSL 패킷이다. 논리적으로 그들은 하나의 긴 메시지인 것 처럼 처리된다. 여기서 n - 1 패킷의 마지막 8 바이트는 패킷 n의 처음 8 바이트의 CBC 잔여 값이다. 즉, 공격자가 자신의 패킷을 SSL 스트림에 삽입할 수 있으면 CBC가 메시지의 시작 부분을 암호화하는 데 사용된다는 것을 알 수 있다.

공격자는 이점을 악용하여 공격할 수 있다. TLS에는 보안 MAC이 포함되어 있으므로 공격자 패킷은 거부되고 보안 채널을 닫기 때문에 통신을 손상시킬 패킷은 하나뿐이다.

다시 댄, 밥, 킴벌리 이야기로 돌아가서 밥이 CBC를 사용하기 시작했다고 가정하자. 무작위로 01 23 45 67 89 ab cd ef의 IV를 생성한다. 이제 Dearest는 IV와 함께 XOR된다.

       Plaintext block 1: Dearest                          Initialization Vector
+----+----+----+----+----+----+----+----+           +----+----+----+----+----+----+----+----+
| 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |           | 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |
+----+----+----+---------+----+----+----+           +----+----+----+---------+----+----+----+
                    |                                                   |
                    |                      +-----+                      |
                    +---------------------^+ XOR +^---------------------+
                                           +--+--+
                                              |
                                              ^
                          +----+----+----+---------+----+----+----+
                          | 44 | 46 | 24 | 15 | EC | D8 | B9 | CF |
                          +----+----+----+---------+----+----+----+
                                              |
                                              ^
                                      +-------+-------+
                                      | DES(password) |
                                      +-------+-------+
                                              |
       Plaintext block 2: Kimberly             |               CBC Residue
+----+----+----+----+----+----+----+----+     |     +----+----+----+----+----+----+----+----+  Output
| 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |     +----^+ 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 +---------->
+----+----+----+---------+----+----+----+           +----+----+----+---------+----+----+----+
                    |                                                   |
                    |                      +-----+                      |
                    +---------------------^+ XOR +^---------------------+
                                           +--+--+
                                              |
                                              ^
                         +----+----+----+----++---+----+----+----+
                         | A6 | BE | C8 | 6B | 02 | AB | E5 | 5F |
                         +----+----+----+---------+----+----+----+
                                             |
                                             ^
                                     +-------+-------+
                                     | DES(password) |
                                     +-------+-------+
                                             |
                                             |
                                             |      +----+----+----+----+----+----+----+----+  Output
                                             +-----^+ F3 | 3C | 02 | A7 | B8 | FD | 22 | 7D +---------->
                                                    +----+----+----+----+----+----+----+----+

댄이 밥의 트래픽을 스니핑하여 보는 것은 ed d7 a5 09 67 d9 89 26 f3 3c 02 a7 b8 fd 22 7d이다. 이제 댄은 밥이 Kimberly를 암호화하도록 속여서 두 번째 블록 f3 3c 02 a7 b8 fd 22 7d과 비교하도록 패킷 인젝션 공격을 시도한다. (밥의 TLS 구현은 이전 블록과 XOR하는 방식이다.) CBC 모드에서 위협이 가능한 지 추가로 가정을 해보자. 댄은 CBC 구성을 위한 이전 블록의 값이 fe dc ba 98 76 54 32 10인 상태에서 밥의 통신에 Kimberly를 삽입하였다.

       Injected block: Kimberly                                CBC Residue(can't change this)
+----+----+----+----+----+----+----+----+           +----+----+----+----+----+----+----+----+  Output
| 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |           | FE | DC | BA | 98 | 76 | 54 | 32 | 10 +---------->
+----+----+----+---------+----+----+----+           +----+----+----+---------+----+----+----+
                    |                                                   |
                    |                      +-----+                      |
                    +---------------------^+ XOR +^---------------------+
                                           +--+--+
                                              |
                                              ^
                          +----+----+----+---------+----+----+----+
                          | B5 | B5 | D7 | FA | 13 | 26 | 5E | 69 |
                          +----+----+----+---------+----+----+----+
                                              |
                                              ^
                                      +-------+-------+
                                      | DES(password) |
                                      +-------+-------+
                                              |
                                              |
                                              |      +----+----+----+----+----+----+----+----+  Output
                                              +-----^+ 1D | FD | E2 | 97 | 8F | EE | E1 | 91 +---------->
                                                     +----+----+----+----+----+----+----+----+

이것은 원래의 암호문의 두 번째 블록과 동등하게 비교되지 않아 아직 쓸모가 없다. 하지만 댄이 XOR에 대해 알고 있다면 이야기가 달라진다. 동일한 값을 두번 XOR하면 첫 번째 값의 영향을 제거한다. 그래서 CBC 이전 블록과 XOR할 것이라는 것을 예측하고 Kimberly를 먼저 XOR한다.

       Injected block: Kimberly                                CBC Residue(can't change this)
+----+----+----+----+----+----+----+----+           +----+----+----+----+----+----+----+----+
| 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |           | FE | DC | BA | 98 | 76 | 54 | 32 | 10 |
+----+----+----+---------+----+----+----+           +----+----+----+---------+----+----+----+
                    |                                                   |
                    |                      +-----+                      |
                    +---------------------^+ XOR +^---------------------+
                                           +-----+

그런 후 첫 번째 블록의 출력 값인 두 번 째 블록(비교 대상 블록)과 다시 XOR한다.

       Plaintext block 1: Dearest                          Initialization Vector
+----+----+----+----+----+----+----+----+           +----+----+----+----+----+----+----+----+
| 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |           | 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |
+----+----+----+---------+----+----+----+           +----+----+----+---------+----+----+----+
                    |                                                   |
                    |                      +-----+                      |
                    +---------------------^+ XOR +^---------------------+
                                           +--+--+
                                              |
                                              ^
                          +----+----+----+---------+----+----+----+
                          | 44 | 46 | 24 | 15 | EC | D8 | B9 | CF |
                          +----+----+----+---------+----+----+----+
                                              |
                                              ^
                                      +-------+-------+
                                      | DES(password) |
                                      +-------+-------+
                                              |
                                 XXX          |               CBC Residue
                                   XXXXX      |     +----+----+----+----+----+----+----+----+  Output
                                       XXXXX  +----^+ 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 +---------->
       Injected block                      XXXXX    +----+----+----+---------+----+----+----+
+----+----+----+----+----+----+----+----+      XXXX                     |
| B5 | B5 | D7 | FA | 13 | 26 | 5E | 69 |          XXXXXX               |
+----+----+----+---------+----+----+----+                XXXX           |
                    |                                        XXXX       |
                    |                      +-----+               XXXXX  +
                    +---------------------^+ XOR +------------------+XXXXX
                                           +--+--+                       XXXX
                                              |                              XXXX
                    Adjusted injected block   ^                                 XXXX
                          +----+----+----+---------+----+----+----+                XXXXX
                          | 58 | 62 | 72 | F3 | 74 | FF | D7 | 4F |                    XXXX
                          +----+----+----+----+----+----+----+----+

그 후 밥을 속여 동일한 CBC 블록을 사용하여 암호화할 수 있다면

       Injected block                                          CBC Residue
+----+----+----+----+----+----+----+----+           +----+----+----+----+----+----+----+----+
| 44 | 65 | 61 | 72 | 65 | 73 | 74 | 20 |           | FE | DC | BA | 98 | 76 | 54 | 32 | 10 |
+----+----+----+---------+----+----+----+           +----+----+----+---------+----+----+----+
                    |                                                   |
                    |                      +-----+                      |
                    +---------------------^+ XOR +^---------------------+
                                           +--+--+
                                              |
                                              ^
                          +----+----+----+---------+----+----+----+
                          | A6 | BE | C8 | 6B | 02 | AB | E5 | 5F |
                          +----+----+----+---------+----+----+----+
                                              |
                                              ^
                                      +-------+-------+
                                      | DES(password) |
                                      +-------+-------+
                                              |
                                              |                CBC Residue
                                              |      +----+----+----+----+----+----+----+----+  Output
                                              +-----^+ F3 | 3C | 02 | A7 | B8 | FD | 22 | 7D +---------->
                                                     +----+----+----+----+----+----+----+----+

출력된 값은 원래의 두 번 째 블록과 동일하다. 이것은 XOR의 교환성 때문에 일어나는 것이다. (a xor b = b xor a) TLS 그룹은 이러한 이론적 결함을 심각하게 생각했지만, SSL 개발자는 그렇지 않았다. 그 결과 BEAST 공격으로 실체화되고 실제로도 악용이 가능하다는 것이 증명되었다.

보안 측면에서 HTTP의 문제점 중 하나는 알기 쉬운 일반 텍스트를 포함한다는 것이다. 일반적인 HTTP Requeset를 살펴보자.

GET /index.html HTTP/1.1
Host: mysite.com
Cookie: Session=12345678
Accept-Encoding: text/html
Accept-Charset: utf-8

분명한 부분은 굵게, 약간의 추측 과정을 거치면 알 수 있는 것을 기울여 구분해보자.

GET /index.html HTTP/1.1
Host: mysite.com
Cookie: Session= 12345678
Accept-Encoding: text/html
Accept-Charset: utf-8

여기서 유일한 변수는 요청되는 페이지와 세션 쿠키의 값이다. 이제 CBC 모드에서 요청 값의 첫 번째 78 바이트가 다음과 같다고 가정해보자.

GET /index.html HTTP/1.1\r\nHost: www.somesite.com\r\nCookie: Session=12345678

password 키와 0x0123456789abcdef IV 값으로 DES CBC 모드 암호화한 결과는 다음과 같다.

GET / ind ex.html HTTP/1.1 \r\nHost : mysite .com\r\n Cookie: Session= 12345678
a7d25abbd67b2dbf e2ade7246ea5ed5 e99063ebe430b75b 746ae5eca36e2bc3 f6f62f99a076056f 6b14704973a779ae 7fa9300d4e490cba b6040b9542a59ad5 f9bb888ac3763722b

공격자는 마지막 블록인 f9bb888ac3763722b에 관심을 가질 것이다. (HTTP 특성으로 인해 민감한 정보가 존재하는 블록을 정확하게 결정할 수 있다.) 패킷을 주입할 수 있다고 가정하고 일치하는 값을 얻을 때까지 00000000부터 시작해서 삽입할 수 있다. 그러나 세션 쿠키가 간단한 8 바이트 숫자 값이라도 을 수행해야한다. 하지만 패킷을 주입할 수 있다면 요청을 수정하는 것도 가능하다.

GET / ind ex.html HTTP/1.1 \r\nHost : mysite .com\r\n Cookie: Session= 12345678
GET / ind ex.jsp H TTP/1.1\ r\nHost: mysite. com\r\nC ookie:S ession=1 2345678

요청 값을 index.jsp 수정하여 제거된 한 문자로 인해 세션 쿠키의 첫 번째 숫자를 찾기 위해서 단지 10개의 추측만 필요하다.

ession=0
ession=1
...

다시 요청 값을 수정한 후 다음 세션 쿠키 값을 추측해보자.

GET / ind ex.html HTTP/1.1 \r\nHost : mysite .com\r\n Cookie: Session= 12345678
GET / ind ex.js HT TP/1.1\r \nHost: mysite.c om\r\nCo okie:Se ssion=12 345678
ssion=10
ssion=11
ssion=12
...

실제 세션 ID 값은 이보다 길고 다양하며 공격을 성립하기 위해서 필요한 조건들이 있다. 해당 공격은 TLS 1.1에서 수정되었으나, 많은 서버들이 오래된 버전을 사용하고 있어 SSL 다운그레이드 고역에 취약하여 클라이언트가 안전한 버전을 지원하다라도 취약한 버전을 사용하도록 속일 수 있다.

참고
데일리 시큐 - SSL 사이트 90%, BEAST SSL 공격에 취약해!
An Illustrated Guide to the BEAST Attack
BEAST

이 블로그의 인기 게시물

X-Frame-Options-Test

X-Frame-Options 테스트하기 X-Frame-Options 페이지 구성 시 삽입된 프레임의 출처를 검증하여 허용하지 않는 페이지 URL일 경우 해당 프레임을 포함하지 않는 확장 응답 헤더이다. 보안 목적으로 사용되는 확장 헤더로 아직 적용되지 않은 사이트들이 많지만 앞으로 점차 적용될 것으로 보인다. X-Frame OptionsDENY, SAMEORIGIN, ALLOW-FROM 옵션을 이용하여 세부 정책을 설정한다. 옵션 설명 DENY Frame 비허용 SAMEORIGIN 동일한 ORIGIN에 해당하는 Frame만 허용 ALLOW-FROM 지정된 ORIGIN에 해당하는 Frame만 허용 크롬 4.1 , IE 8 , 오페라 10.5 , 사파리 4.0 , 파이어폭스 3.6.9 이상에서는 DENY , SAMEORIGIN 이 적용되며, ALLOW-FROM 은 각 브라우저 마다 지원 현황이 다르다. https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Frame-Options 해당 확장헤더는 브라우저에서 처리하는 응답 헤더이므로 미지원 브라우저 사용 시 설정과 무관하게 페이지 내 포함된 모든 Frame을 출력한다. (검증 테스트: Opera 5.0.0) 테스트 코드 DENY <!DOCTYPE html> < html lang = "en" > < head > < meta http-equiv = "X-Frame-Options" content = "deny" /> < title > Deny option Test </ title > </ head > < bod

C-lang-vulnerabilities

C 언어 공통 취약점 해당 글은 CERN Computer Security의 Common vulnerabilities guide for C programmers 글을 참고하여 작성하였습니다. C언어에서 발생하는 대부분의 취약점은 버퍼 오버플로우와 문자열 처리 미흡과 관련되어 있다. 이는 segmentation fault를 유발하고 입력 값을 조작할 경우 임의 코드 실행으로 이어질 수 있다. 이에 대부분의 에러와 조치 방안을 살펴보자고 한다. gets stdio gets() 함수는 버퍼 길이를 검증하지 않아 사용 시 항상 취약성을 야기한다. Vulnerable Code #include<stdio.h> int main() { char username[ 8 ]; int allow = 0 ; printf ( "Enter your username, please: " ); gets(username); //악의적인 값 삽입 if (grantAccess(username)) { allow = 1 ; } if (allow != 0 ) { //username을 오버플로우하여 덮어씀 privilegeAction(); } return 0 ; } Mitigation fgets() 함수 사용 및 동적 메모리 할당 #include <stdio.h> #include <stdlib.h> #define LENGTH 8 int main () { char * username, *nlptr; int allow = 0 ; username = malloc (LENGTH * sizeof (*username)); if (!username) return EXIT_FAILURE; printf ( "Enter your username, please:

HTML/CSS를 활용하여 카카오톡 클론 만들기

시간을 내어 HTML과 CSS를 공부한 것은 대학생 때가 마지막이었던 것으로 기억한다. 그 동안 사이드 프로젝트로 진행했던 여러 아이디어들을 결국 서비스하지 못했던 결정적인 이유는 프론트 엔드 기술 부족이었다고 생각하고 우선 HTML과 CSS 학습을 진행하였다. 프론트 엔드 기술은 많은 발전을 거듭하여 예전에 비해 큰 복잡성을 가지게 되었다. 빠른 시간 안에 숙지하지 못한 기법들에 대해서 알아보고 구현하고자 하는 아이디어에 활용할 수 있을 정도로 진행해보고자 한다. 또한 보안적 관점에서 발생할 수 있는 프론트 엔드 위협에 대해 파악할 수 있는 좋은 밑거름이 되길 기대해본다. 우선적으로 진행한 카카오 톡 디자인 클론은 노마드 아카데미의 강의를 수강하며 진행하였고 결과는 아래의 링크에서 확인할 수 있다. 소스코드 저장소 구현된 웹 페이지