본문 바로가기

System/Linux

System/Linux/메모리 보호기법 해제 - 1

반응형
# 환경 OS : ubuntu 14.0.4.5 LTS /
# 커널 : 4.10.0-42 

# 기본적인 /proc/sys/kernel/* 수정방법
  • /etc/sysctl.conf에 커널 옵션 값들을 넣어 부팅할 때 수정되도록 하는것.
  • sysctl 명령으로 수정.
  • /proc/sys/ 디렉토리 내 파일들을 편집기로 열어 수정.
  • echo [값] > /proc/sys/kernel/@ 으로 표준 입력으로 파일에 직접 값을 넣어 변경
# 적용 확인
- sysctl -p 명령어를 통해서 확인할 수 있습니다.

# ASLR 
- 확인은 cat/proc/self/maps 명령을 통해 자신의 스택 힙 라이브러리 등이 랜덤하게 바뀌는 것을 확인 할 수 있습니다.
- ASLR을 해제하는 명령은 echo 0 > /proc/sys/kernel/randomize_va_space 를 입력하면됩니다. 입력전 vi /proc/sys/kerne/randomize_va_space로 상태값을 보면 2로 ASLR이 스택, 라이브러리, 힙 모두에 걸려있습니다 vi로 수정하려고 하면 read-only라 수정이 불가능하므로 root 권한으로 실행합니다.
  • 0 : 해제
  • 1 : 스택 , 라이브러리
  • 2 : 스택, 라이브러리, 힙

# DEP / NX
- 레드햇에서 부터 시작된 프로텍트 기법이고, 리눅스 시스템에서 웜의 위험을 줄이고, 자동화된 원격 공격을 막고자 만들었다고 합니다. - https://en.wikipedia.org/wiki/Exec_Shield
-  첫 프로젝트의 결과는 x86 CPU위에 NX bit을 에뮬레이트하는 리눅스 커널의 보안 패치였습니다. 결과적으로 메모리 구조에 덮어쓰거나 코드를 삽입하는 버퍼오버플로우 같은 공격을 막을 수 있습니다. 
- Exec-shield에서 빠져나온 프로젝트하나로 PIE(위치 독립 실행 : Position Independent Executables이 있습니다. 
  • 포맷 스트링 버그와 같은 exploit을 불가능하게 합니다.
  • 리눅스 커널의 주소 공간 랜ㅏ덤화 패치 입니다.
- 수정을 할려고보니 일반적으로 echo 0 > /proc/sys/kernel/exec-shield 를 통해서 수정을 하지만 몇몇 운영체제에서는 해당 설정 값이 존재 하지 않을 때(No such file or diretory)가 있습니다. 제가 그랬고 제가 사용한 운영체제는 ubuntu로 커널버전 4.10.0-42에 해당했습니다.
  • sysctl -w kernel.exec-shield=0
  • echo 0 > /proc/sys/kernel/exec-shield
- 그래서 컴파일 옵션을 주어 컴파일시 실행이 가능하게 하도록 합니다.
  • -z execstack

# 컴파일 옵션
- SSP(Stack Smashing protector) 옵션을 이용해 컴파일 할시 스택 카나리가 생성되며, 카나리 값을 덮어버리게 되면 프로그램이 종료됩니다.
  • STACK GUARD (SSP) 해제 : -fno-stack-protector
- dummy 값 고정 : -mpreferred-stack-boundary=2
- fno-builtin : stlib와 링크되지않고 단독으로 링크
- 전체적인 컴파일 옵션 : -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -fno-builtin

# ASCII-Armor
- 주소값에 널바이트가 삽입되어 라이브러리를 호출하는 BOF 공격시 이 주소로 접근할 수 없게 하는 방어기법입니다. 따로 수정하는 값이 없고 우회해야합니다.

# 추가적인 Security
-  modules_disabled : linux상에서 module이 전역적으로 로드되는 것을 막음.
  • 0 : off
  • 1 : on
- kexec_load_disabled : 커널공간의 실행을 막음.

  • 0 : false 안막음.
  • 1 : true 막음.


반응형