CBC(Cipher Block Chaining) Padding oracle Attack
1. 개요
- Oracle? DB가 아닌 "응답에 대한 판독"의 의미
- Padding? (PKCS5 - 8 bytes/block , PKCS7 - 16bytes/block)
평문 데이터가 블록 크기의 배수라면 패딩만 있는 빈블록이 생성됨. 왜냐하면 마지막 byte블록이 아래 예제와 같은 문자열일 경우 패딩과 문
자열에 대한 구분이 필요하기 때문에 패딩으로 채운 빈 블록이 생성 됨.
- 패딩 오라클 공격이란 패딩이 올바르게 되었는지 여부에 따라 서버의 응답이 다르기 때문에 이것을 이용한 공격이라고 정의할 수 있음
- CBC Mode?
- 각 블록의 평문과 앞 블록 암호문과의 배타적 논리합(XOR)으로 암호화하는 것으로, 블록 간의 의존 관계를 갖는 이용 모드.
2. 내용
+ 패딩 오라클 공격의 전제는 서버 응답 확인
- 올바른 암호화 값을 받았을 경우(200 OK)
- 패딩이 올바르지 않은 암호문을 받았을 경우(500 Internal Error)
- 패딩은 올바르나 잘못된 암호문을 받았을 경우(200 Ok - 커스텀 에러 메시지)
- 정상적인 암호화 과정
- EX)
- 암호문이 있다고 가정 : 7B216A634951170F / F851D6CC68FC9537 / 858795A28ED4AAC6
- 첫번째 블록은 IV로 사용됨 = 7B216A634951170F = IV
- 암호문1 = 7B216A634951170F
- 평문 : BRIAN;12;1;
- Padding Oracle 공격 방법
1) Intermediary Value만 찾으면 된다
2) How?
3) 패딩은 0x01 ~ 0x08까지로 제한됨(8Byte Block기준), 따라서 패딩이 1개일 경우부터 8개일 때까지의 경우를 모두 생각해서 IV를 대입
4) 평문의 마지막 바이트 패딩이 0x01이라고 가정, IV의 마지막 Byte가 공격벡터, 이 때 공격벡터의 범위는 0x00부터 0xFF, 0x3C일 때 200 응답,
따라서 중간 값은 0x3D(0x3C ^ 0x01)
5) 평문의 마지막 바이트 패딩이 0x02이라고 가정, IV의 마지막 2Byte가 공격벡터, 이런식으로 첫번째 IV까지 한 바이트씩 공격벡터를 늘려감.
6) 이렇게 해서 Intermediary Value를 알아 낼 수 있음
7) Intermediary Value도 알고 IV도 아는 상황(최초 암호문 내의 IV, 따라서 평문을 얻어낼 수 있음