오늘 끝나면
익스플로잇 완화
- ✓익스플로잇 완화의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 익스플로잇이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
ASLR·DEP — 공격과 방어의 군비경쟁 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
화이트해킹 · 11
익스플로잇
완화
버그를 다 없애는 건 불가능하다.
그래서 OS는 공격을 “어렵게” 만드는 벽을 깔아 둔다.
ASLR, DEP, 카나리가 완화의 삼총사다.
버그는 못 없애니 비싸게 만든다
10강에서 본 버퍼 오버플로우 같은 버그는 끝없이 새로 생긴다. 다 잡는 건 포기하는 게 현실적이다.
그래서 방어 전략이 둘로 갈린다.
하나는 취약점 제거다. 코드를 고쳐 버그 자체를 없앤다.
다른 하나는 완화(mitigation)다. 버그가 남아 있어도 공격을 못 써먹게 막는다.
완화의 목표는 버그를 0으로 만드는 게 아니라 공격 비용을 올리는 것이다.
버그 하나로 끝나던 공격을 여러 조건을 다 맞춰야 되게 바꿔 놓는다.
ASLR, DEP, 카나리는 전부 공격을 한 단계씩 더 어렵게 만드는 벽이다.
버그를 코드에서 직접 없앤다
현실에선 다 못 잡는다
버그가 남아도 못 써먹게 막는다
ASLR · DEP · 카나리
ASLR, 주소를 매번 섞는다
10강의 공격은 반환주소를 내가 아는 주소로 덮어 거기로 점프하는 것이었다. 핵심 전제는 그 주소를 안다는 데 있다.
ASLR(주소 공간 배치 무작위화)은 이 전제를 깬다.
프로그램이 실행될 때마다 코드, 스택, 라이브러리가 매번 다른 주소에 깔린다.
어제 0x400000이던 자리가 오늘은 0x7af120이 된다.
공격자는 심을 목표 주소를 모르고, 추측해 봐야 거의 다 빗나간다.
빗나간 점프는 엉뚱한 데로 가고 보통 프로그램이 그냥 죽는다.
방어 관점에선 공짜에 가까운 벽이다. OS가 켜만 주면 모든 프로그램이 덕을 본다.
| 코드 | 스택 | 라이브러리 | |
|---|---|---|---|
| 1회차 | 0x400000 | 0xbf820 | 0x7f1200 |
| 2회차 | 0x7af120 | 0x3c901 | 0x5ad880 |
| 3회차 | 0x2c8a40 | 0xe6213 | 0x91f400 |
DEP·NX와 스택 카나리
ASLR이 어디로 점프할지를 막는다면, 나머지 둘은 다른 길목을 막는다.
DEP / NX(데이터 실행 금지)는 메모리를 두 종류로 나눈다.
코드 영역은 실행만 되고, 데이터 영역은 읽고 쓰기만 된다.
공격자가 입력으로 심은 셸코드는 데이터 칸에 있으니 점프해도 실행이 거부된다.
스택 카나리는 버퍼와 반환주소 사이에 감시값(카나리)을 끼워 둔다.
오버플로우가 반환주소를 덮으려면 이 값부터 망가뜨려야 한다.
함수가 끝날 때 카나리가 바뀌었으면 침범을 알아채고 즉시 멈춘다. 반환주소까지 닿기 전에 끊긴다.
심은 셸코드는 데이터 칸에 있어 실행이 거부된다
끝날 때 카나리가 바뀌면 멈춘다
완화 토글, 직접 해본다
말로는 감이 안 온다. 오른쪽에서 같은 가상 공격에 방어를 켰다 껐다 해본다.
공격은 늘 세 단계로 흐른다.
먼저 카나리를 통과하고, 주소를 맞히고, 코드를 실행한다.
세 단계가 다 통과해야 장악 성공이다.
방어를 다 끄면 한 줄 공격이 그대로 뚫린다.
카나리만 켜도 1단계에서 끊기고, ASLR만 켜도 주소가 빗나가 2단계에서 멈춘다.
하나만 켜도 한 단계가 막히고, 셋을 겹쳐 켜면 벽이 더 두꺼워진다. 이게 완화의 작동 방식이다.
방어가 다 꺼졌다. 같은 한 줄 공격이 카나리를 지나 주소를 맞히고 데이터를 코드로 실행한다. 흐름이 통째로 넘어간다.
하나만 켜도 공격 한 단계가 끊긴다. 겹쳐 켜면 더 두꺼워진다
공방의 군비경쟁
완화는 끝이 아니다. 벽이 올라가면 공격도 그 벽을 우회하게 진화한다. 이게 군비경쟁이다.
DEP가 셸코드 실행을 막자, 공격자는 코드를 새로 심지 않고 이미 있는 코드 조각을 이어 붙이는 ROP로 우회한다.
ASLR이 주소를 섞자, 메모리를 흘리는 다른 버그로 주소를 먼저 캐내는 정보 유출을 끼워 넣는다.
그래서 방어도 멈추지 않는다. CFI, 섀도 스택 같은 새 완화가 계속 얹힌다.
방어 관점의 결론은 단순하다. 완화 하나에만 기대지 말고 여러 겹을 겹쳐 둔다.
한 겹이 우회돼도 다음 겹이 남아 공격 비용을 계속 끌어올린다. 이게 다층 방어다.
Q. ASLR이 어렵게 만드는 것은? (버그 발견, 목표 주소 맞히기, 데이터 실행, 네트워크 접속)
정답은 목표 주소 맞히기다.ASLR은 코드, 스택, 라이브러리를 매번 무작위 주소에 깔아 둔다.
그래서 공격자가 점프할 주소를 알 수 없고, 추측해도 거의 다 빗나간다.
데이터 실행을 막는 건 DEP/NX이고 침범 탐지는 카나리다. 역할이 서로 다르다.