[정의] 힙 데이터 영역에서 발생하는 버퍼 오버플로의 한 종류로, 동적 메모리 할당 연결(malloc 메타 데이터 같은)을 겹쳐쓰고 프로그램 함수 포인터를 겹쳐쓰기 위해 결과로 나온 포인터를 교환하는 기법.
[개념] 프로그램이 실행되면, 실행에 필요한 정보들이 메모리 영역에 올라가는데 크게는 코드 영역, 데이터 영역, 스택 영역, 힙 영역 으로 구분. - 코드영역 : 프로그램의 코드가 올라가는 영역, 여기서코드란, 컴파일된 기계어코드 - 데이터영역: 전역변수와 정적변수등이 할당되는영역. 초기화된 데이터는 data 영역에 저장. 초기화 되지 않은 데이터는 bss 영역에 저장 - 스택영역 : 지역변수와 매개변수가 저장되는 영역 - 힙영역 : 빈공간, 필요에 의해 메모리를 할당 및 해제(컴파일러가 예측 할 수 없는, 프로그래머가 관리하는 영역)
[스택 대신 힙영역 사용이유] - 동적할당, 컴파일시기에 크기를 알수없는 데이터, 컴파일할때는크기를 알지 못하다가, 프로그램이 실행되었을때 크기가 결정되는 경우에 사용
[원리] Heap 영역의 낮은 주소에 있는 버퍼가 넘쳐서 다른 버퍼를 침범하여 발생
[예시]
1) 두 개의 heap 메모리인 input과 secret을 할당한 뒤, secret 파일을 읽어서 두 번째로 할당했던 secret 영역에 저장 2) 그 후 input 영역에 입력 값을 받고 출력시켜주는 간단한 코드 3) 취약점은 read 함수, input으로 할당한 메모리 크기는 40 바이트이지만 read 함수를 통해 최대 100 바이트까지 입력할 수 있어 Heap Overflow 가 발생 4) Heap Overflow를 이용해서 secret 에 할당된 메모리 영역의 직전까지 데이터를 채워주면, 문자열이 연결되어 printf 함수가 secret 메모리의 값까지 출력 됨. 5) 40 바이트 만큼 할당 한다면 input 에 할당된 메모리와 secret 에 할당된 메모리의 거리차이는 40 바이트 6) 40 바이트를 할당한다고 해서 딱 40 바이트만 할당되는 것은 아니고 메모리의 할당과 해제를 관리하기 위한 정보들이 함께 들어가기 때문에 실제 할당되는 사이즈는 조금 늘어나게 됨. 그래서 문자열의 길이를 조금 늘려주면 Heap Overflow 를 이용한 Leak 이 가능 7) 만약 뒤쪽에 함수 포인터가 존재한다면 그 부분을 조작하여 프로그램의 실행 흐름을 변조도 가능
void manipulate_string(char* string) { char buf[24]; /* 복사하려는 buf와 길이를 비교. */ if (strlen(string < sizeof(buf)) strncpy(buf, string, sizeof(buf)-1); /* 문자열은 반드시 null로 종료 */ buf[sizeof(buf)-1] = '₩0'; …… }
매개변수로 받은 문자열 크기가 지역버퍼에 복사가 되는지 확인하지 않고 strcpy() 함수를 이용 데이터를 복사
매개변수로 받은 변수와 복사하려는 buf의 크기를 비교하여 buf의 크기를 제한하고 마지막 문자에‘₩0’을 삽입
[사례]
#include <stdio.h>
void sample_function ( char* string )
{
char buffer[16];
strcpy (buffer, string);
return;
}
void main()
{
char big_buffer[256];
int i;
for (i=0; i<256; i++)
big_buffer[i] = 'A';
sample_function (big_buffer);// 큰 버퍼를 함수에 보냄
}
}
- 버퍼 오버플로우를 일으키고 운영체제의 스택이 크래시되게 하여 특정 코드가 실행되게 함.
[공격 종류] -서비스 거부 공격: 메모리 스택에 많은 데이터를 대입하여 발생. 운영체제 데이터와 같은 중요한 정보를 덮어 써서 시스템 운영체제가 기능을 수행하지 못하게 함. -접근 권한 획득: 스택에 적당한 크기의 정보를 입력하여 복귀 포인터를 덮어씀. 원래 실행되어야할 코드 대신 자신의 코드를 가리켜 실행시킴. 패스워드 해쉬 값을 출력하거나, 새로운 계정을 생산하는 것등을 할 수 있음.
[대응방안] 스택 영역 실행/쓰기제한 및 무결성 검사. 프로그램/서버의 신속한 패치, 보안 OS 도입, 시큐어코딩.
기본 예제 (위키피디아)
아래의 예제에서, 프로그램은 메모리에서 인접해 있는 두 아이템을 정의하였다: 8 바이트 길이 스트링 버퍼, A. 그리고 2 바이트 정수형, B. 우선, A 는 8바이트 모두 숫자 0값만 포함하고 B는 숫자 3을 포함한다. 문자들은 1바이트 크기이다.
A
B
0
0
0
0
0
0
0
0
0
3
이제, 프로그램은 문자열 "excessive"를 A 버퍼에 저장한다. 한 바이트짜리 0값이 스트링의 끝임을 알리기 위해 따라온다. 스트링의 길이를 확인하지 않음으로 B의 값을 덮어쓴다.
A
B
'e'
'x'
'c'
'e'
's'
's'
'i'
'v'
'e'
0
비록 프로그래머가 B가 바뀌는 것을 전혀 의도하지 않았다 하더라도, B의 값은 문자열의 한 부분을 구성하는 숫자로 바뀌었다. 이 예제에서ASCII를 사용하는빅 엔디언시스템에서 "e" "0"는 숫자 25856가 될 수 있다. B가 프로그램이 정의한 유일한 다른 변수였다면, B의 끝을 지나가는 긴 스트링을 쓰는 것은세그멘테이션 오류, 프로세스 종료와 같은 오류를 발생시켰을 것이다.
[정의] 공격자가 자신의 IP address를, 공격하고자 하는 네트워크의 호스트 IP Address로 바꾸어 IP 기반의 인증을 무력화 시키는 공격.
[절차]
Target System과 Client는 신뢰관계 형성 (ID, PW없이 접근). IP Protocol 취약점을 습득하기 위해서는 Sniffing 공격이 선행(Seq Number 획득)
1.공격자는 클라이언트에 TCP SYN Flooding 공격 (rsh,rlogin)
2.공격자는 클라이언트의 IP로 속여 서버에 연결. 3.서버는 SYN/ACK 패킷을 보내고 클라이언트는 TCP SYN Flooding 공격때문에 연결이 이뤄지지 않고 서버 패킷은 사라지게 된다.(미확인) 4.공격자는 서버에 ACK 패킷을 보낸것처럼 속이면서, IP Spoofing 명령어가 들어있는 패킷을 보내 신뢰 관계에 있는 클라이언트라고 속이면 연결이 이루어지게 된다.
[대응방안] - 외부에서 들어오는 패킷중에서 출발지 IP 주소(Source IP Address)에 내부망 IP 주소를 가지고 있는 패킷을 라우터 등에서 패킷 필터링을 사용하여 방어. - 내부사용에 의한 공격은 막을 수 없으므로 각 시스템에서 TCP Wrapper, ssh 설치 운영하고 rsh rlogin 등과 같은 인증과정이 없는 서비스는 미사용. - IP Spoofing TCP/IP 설계와 구현의 문제이므로 새 프로토콜을 사용하지 않는 이상 완벽한 보호대책은 존재할 수 없으므로 지속적인 관리와 점검필요.
- DNS캐시 포이즈닝 공격에 대응하기 위해,공개키 암호화 방식의 전자서명 기술을DNS체계에 도입한 보안 기술
II. DNSSEC의 작동방식 및 상세설명
가.DNSSEC의 작동방식
- 단계별 DNSKEY를 통한 서명을 사용한 Trust Chain 구현 통한 DNS 공격 방어
나.DNSSEC의 상세설명
구 분
세부항목
설 명
구성요소
DNSKEY
- 도메인 존(Zone)의 공개키 데이터를 저장하여 제공 하기 위한 리소스 레코드(RR) - Zone은 개인키와 공개키 쌍을 가지고 있으며 개인키는 안전한 장소에 따로 보관 - 개인키와 쌍을 이루는 공개키는 DNSKEY RR의 형태로 명시되어 질의응답을 통해 배포 - ZSK : Domain zone의 모든 리소스 레코드 각각 서명 위한 용도 - KSK : DNSKEY 리소스 레코드 자체를 서명 하기 위한 용도
RRSIG
- Resource RecordSignature - DNS의 각 리소스 레코드 데이터의 전자 서명 데이터 저장 용도 - DNS 응답 메시지에 응답 대상 리소스 + RRSIG 형태로 응답
DS (Delegation Signer)
- DNS 보안 측면 인증 위임 체계 구성 위한 데이터 저장 RR - 자식 Domain zone KSK 확증 수단 제공 통한 Trust Chain 형성
NSEC / NSEC3 (Next Secure)
- DNSSEC 보안 기능 중 DNS 데이터 부재 인증용 리소스 레코드 - DNS zone에 존재 하지 않는 리소스 레코드 위장 공격 차단
작동방식
1) RRset 생성
- 동일한 유형의 레코드를 자원 레코드 세트(RRset)로 그룹화
2) 서명
- RRSet 생성이후 ZSK를 이용해 각각의 RRset에 서명 - DNSKEY를 KSK를 이용하여 서명하고 RRSIG로 저장
3) 검증
- 원하는 RRset을 요청하면 해당 RRSIG 레코드도 함께 반환 - 공개 ZSK와 공개 KSK가 들어 있는 DNSKEY 레코드를 요청하면 DNSKEY RRset의 RRSIG도 함께 반환 - 공개 ZSK로, 요청한 RRset의 RRSIG를 확인 - 공개 KSK로, DNSKEY RRset의 RRSIG를 확인
[정의] TCP/IP 프로토콜의 IP계층에서 무결성과 인증을 보장하는 인증헤더(AH)와 기밀성을 보장하는 ESP를 이용한 IP보안 프로토콜
[동작모드]
- 트랜스포트 모드: Transport Layer에서 Network Layer 로 오는 정보만 보호. IP 헤더를 보호하지 않음. Peer-to-peer
- 터널모드 : 전체 IP 패킷을 보호. 헤더를 포함한 IP 패킷을 취해서, 전체 패킷에 IPSec 보안을 적용한 다음 새로운 IP 헤더 추가, 새로운 IP 헤더는 라우터의 IP. site-to-site
[프로토콜]
- AH(Authentication Header. 데이터 무결성과 IP 패킷의 인증을 지원, 재생방지(anti-reply) 서비스를 제공, 기밀성을 제공해주지는 않음)
- ESP(Encapsulation Security Payload. 암호화 기법을사용하여 데이터의 무결성, 비밀성의 기능을 제공하는 프로토콜, 프라이버시 제공)
[정책 및 키관리] -SPD(Security Policy Database): 패킷에 대한 보안 정책을 적용하며, 모든 트래픽 처리 시에 참조. SAD를 이용하기 전에, 호스트 패킷에 대해 규정된 정책을 결정.(종류: Drop(폐기), 통과(Bypass), 적용(Apply) 등) -SAD(Security Authentication Database): 양단간의 비밀 데이터 교환을 위해 미리 설정되어야 할 보안 요소들에 대한 데이터 관리. -IKE(Internet Key Exchange): inbound 와 outbound 보안 연관을 생성하기 위하여 설계된 프로토콜로 IPSec을 위한 SA(Security Association) 생성. Key 를 주고 받는 알고리즘, 공개된 네트워크를 통하여 Key 를 어떻게 할 것 인가를 정의, IKE 교환을 위한 메시지를 전달하는 프로토콜. ISAKMP(키교환, 인증을 위한 프레임워크, 메시지포멧), SKEME(인증을 위한 공개키 암호화 기법), Oakley(Mode-based 메커니즘)의 3가지 방식 중 Oakley, SKEME 를 다포함하는 ISAKMP 를 주로 사용.
[IKE SA(Security Association)과정] -IKE Phase 1 (IKE SA설정) : 1) IKE 보안 파라미터 협상과정, 2) IKE SA용 마스터키가 설정, 3) 상호 인증과정 -IKE Phase 1.5(Option) : - 추가인증(Xauth), 클라이언트에게 파라미터 값 전달(Mode config) -IKE Phase 2 (IP Sec SA 설정) : 4) IPSec SA 보안 파라미터 협상 과정, 5) 세션키 생성, 6) 상호인증