2021년에도 Black Hat Aisa 리뷰 보드로 활동을 하게 되어 보게 된 논문인데, 보안 관련 3대 학회로 손꼽히는 ACM CCS 2020에 채택된 논문입니다. 제목에서도 알 수 있듯이 리눅스 커널 공격에 사용되는 elastic object, 즉 우리말로 옮기면 크기가 가변적인 객체와 관련해서 체계화 연구를 수행한 내용입니다.

Elastic object의 핵심은 구조체 내부에 버퍼나 버퍼의 주소를 가리키는 포인터가 있고, 그리고 길이를 나타내는 필드가 있다는 점입니다. 이러한 특징으로 인해 elastic object의 버퍼 포인터나 길이를 조절하면 임의의 커널 메모리 읽기(arbitrary read)나 범위를 넘겨 읽기(out-of-bound read, OOB read)가 가능하고, KASLR(Kernel Address Space Layout Randomization)을 무력화할 수 있는 커널 함수 포인터나 Stack canary 등을 읽어낼 수 있죠.

Elastic object 공격으로 인한 영향 - 출처: A Systematic Study of Elastic Objects in Kernel Exploitation

사실 이러한 객체는 흔한 듯하면서도 흔치 않은데요, 커널 구조체의 대부분은 크기가 고정되어 있거든요. ^^;;; 이 논문에서는 아래처럼 elastic object를 찾아서 리스트를 만들어 놓고, 이와 관련해서 커널 데이터를 유출할 수 있는 함수들도 정리해두었습니다. 이 과정에서 정적/동적 분석 기법을 활용했다고 하는데, 오탐을 줄이기 위해 함수 리스트 같은 경우는 수동으로(manual) 선정했다고 하는군요.

Elastic kernel objects - 출처: A Systematic Study of Elastic Objects in Kernel Exploitation 
커널에서 유저로 데이터를 전달할 수 있는 함수 목록 - 출처:A Systematic Study of Elastic Objects in Kernel Exploitation

개인적으로 이 논문의 의의는 elastic object 관련 내용을 체계화했다는 것에 있다고 생각합니다. 임의 메모리 읽기나 범위 넘겨 읽기 같은 경우는 논문의 위협 모델(thread model)에도 나와 있지만, 공격자가 이미 임의 메모리 쓰기 취약점(arbitrary memory write)을 가지고 있다고 가정하기 때문에 영향력이 크지 않다고 생각합니다. 사실 임의 메모리 쓰기 취약점이 임의 메모리 읽기 취약점보다 귀하기 때문에 이런 취약점이 더 영향력이 크고 더 유용하거든요. 물론, 제대로 쓰기 위해서는 논문에서 기술한 것처럼, 임의 메모리 읽기 취약점을 이용해서 KASLR을 무력화해야 좀 더 공격 성공 확률이 올라가긴 하지만요. ^^;;;

해결책(mitigation)의 경우도 격리(isoloation) 기법을 사용했는데요, 이 방법 또한 일반적으로 활용하는 방법입니다. 격리를 하면 elastic object만 따로 떨어지는데, 인접해있는 kernel object를 통해 주요 정보를 유출할 수 있는 기회가 적어지긴 합니다. 다만, 메모리 풀(pool)을 분리해야 하므로 코드 수정이 필요하고, 이로 인한 부수효과(side effect)가 어떠한 형태로 나타나는지 심도 깊은 평가도 필요하지요. 논문에서도 성능 등의 여러 관점에서 평가를 하는데요, 실험실(lab) 환경과 실제 운영 환경은 다르기 때문에 논문의 결과가 실제 필드로 적용되기까지는 많은 시간이 필요합니다. ^^;; 참고로 최근에 도입된 꽤 유명하고 대표적인 격리 기법에는 KPTI(Kernel Page Table Isolation)가 있습니다. 바로, 세간을 떠들썩하게 한 멜트다운(meltdown) 취약점을 막기 위해 도입한 것이죠.

리뷰보드 활동 때문에 새해 첫날부터 머리가 아프... 여튼 흥미로운 논문이었습니다.

그럼 새해 복 많이 받으세요!!

가끔 임시 비밀번호를 만들어 써야하는 경우가 종종 있는데요, 임시 비밀번호지만 뭔가 습관대로 만드는 것이 불안해서 임의의 문자열을 뽑는 기능을 검색해봤습니다. 다양한 방법이 있었는데 스택 오버플로우(unix.stackexchange.com/questions/230673/how-to-generate-a-random-string)에 좋은 방법이 있었습니다. ^^)/~ 즉, 아래처럼 하면 된다는 이야기지요.

$> head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo ''
uqpmpi0CpJOEh1NJL9tffi6mmPLe6ASk

$> head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo ''
cnxc8yYGGrZwz5noljO18yg8xNBH9kHY

$> head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo ''
YUvAlrdtyNUhrr5GSXLKLeA7EkSoZuTV

꽤나 유용하게 사용할 수 있겠군요.

그럼 좋은 하루 되세요 ^^)/

최근 데비안(Debian) 리눅스에서 그놈(Gnome) 데스크탑을 버리고 i3 윈도우 매니저를 사용하기 시작했습니다. i3는 틸팅(Tilting), 화면을 이등분 해서 창을 정렬하는 것이 특징인데요, 처음에는 좀 당황스럽지만 익숙해지면 vi를 사용하듯이 창을 옮겨다니면서 쓸 수 있습니다. 물론 이렇게까지 익숙해지려면 시간을 많이 투자해야 한다는 것이 함정이지만요... 쿨럭..;;;;

그놈을 버리고 나니 아쉬운 부분이 여럿 있는데요, 그중에 하나가 모니터 밝기 조절입니다. gnome-control-center를 실행해서 해결해 볼까도 했지만 커맨드 라인으로 처리할 수 있는 방법을 찾았습니다. 방법은 간단한데요, xrandr로 연결된 모니터를 찾고 밝기를 조절하는 겁니다. 아래처럼 말이죠. ^^;;;

# 연결된 모니터를 찾음.
$>xrandr -q | grep connected
eDP-1 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 263mm x 164mm
DP-1 connected 2560x1440+1920+0 (normal left inverted right x axis y axis) 698mm x 392mm
HDMI-1 disconnected (normal left inverted right x axis y axis)

# 모니터의 밝기를 70%로 조절함.
xrandr --output eDP-1 --brightness 0.7

생각보다 간단하네요. 그럼 좋은 하루 되세요 ^^

리눅스(linux) 환경에서 권한 상승이 필요할 때 많이 쓰는 방법이 sudo를 이용하는 것인데요, 다들 아시겠지만 sudo를 사용하려면 sudo 패키지가 시스템에 설치되어 있어야 합니다. 그리고 _etc_sudoers 파일에 sudo를 사용할 계정이 추가되거나 sudo 그룹에 가입되어야 하지요.

일반적인 상황은 아니지만, 간혹 자동화를 목적으로 사용자의 패스워드 입력 없이 특정 실행파일을 관리자(root) 권한으로 실행해야 할 경우가 있습니다. 이런 경우, 사용할 수 있는 방법이 _etc_sudoers 파일에 패스워드 입력을 생략하는 내용을 추가하는 건데요, 사용자 명이 user이고 관리자 권한으로 실행해야할 파일이 _usr_bin/xeyes라면 다음과 같이 마지막줄에 추가하면 됩니다.

# /etc/sudoers 파일의 내용
... 생략 ...

#includedir /etc/sudoers.d
user    ALL=(ALL)   NOPASSWD:   /usr/bin/xeyes

만약 user의 경우는 모든 파일을 패스워드 입력없이 사용하고 싶다면 아래와 같이 변경하시면 됩니다.

user ALL=(ALL)  NOPASSWD:   ALL

그럼 좋은 하루 되세요 ^^

요즘 만자로(Manjaro) 리눅스를 주로 쓰고 있는데요, 사용하는 PC의 NVIDIA 그래픽카드와 궁합이 좋지 않은지 화면이 찢어지는 문제가 발생했습니다. ㅠㅠ 눈 상태가 요즘 점점 나빠지고 있는데 화면까지 그런 문제가 생기니 어떻게든 해결해야겠다는 생각이 들더라구요. 아. 물론... 쉬는 게 가장 좋기는 한데... 요즘 발표 요청이 많이 들어와서 주말에도 바쁜 나날을 보내고 있습니다. ㅠㅠ

그렇게 찾다보니, 드라이버를 다시 한번 설치 봐야겠다고 알아보니, 최신 NVIDIA 드라이버를 다운받아서 설치하는 방법이 있었습니다. 이렇게 해보니 찢어지는 현상이 없어졌네요. ^^;;; 결국 드라이버의 문제였던 듯... ㅠㅠ

만자로에서 NVIDIA 드라이버를 설치하는 방법은 아래와 같습니다.

# 아래처럼 입력해서 만자로 하드웨어 디텍터로 설치하고 리부팅합니다.
$> sudo mhwd -a pci nonfree 0300
$> sudo reboot

# 리부팅 후 아래처럼 입력하면 NVIDIA 설정 프로그램을 실행할 수 있습니다.
$> nvidia-settings

최신 NVIDIA 드라이버를 만자로 리눅스에 설치하는 방법은 공식 사이트를 참고하세요.

만자로 공식 사이트: https://linuxconfig.org/how-to-install-the-nvidia-drivers-on-manjaro-18-linux

그럼 좋은 하루 되세요 ^^

만자로 리눅스(Manjaro Linux)는 아치(Arch) 리눅스 기반에 롤링 릴리즈를 장점으로 내세운 배포판인데요, 요즘 주 배포판으로 사용하고 있습니다. 기본 설치 후 한글 관련 설정만 해주면 쓸 수 있을 정도로 꽤나 잘 관리되어 있는데요, 한글 관련 설정 방법은 아래와 같습니다.

# iBus 한글 설치
$> sudo pacman -S ibus-hangul ibus-qt

# 설치 후 홈 디렉토리에 $HOME/.xprofile을 생성하고 아래 내용을 추가
$> vi $HOME/.xprofile
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
export OOO_FORCE_DESKTOP="gnome"
ibus-daemon -drx

그리고 로그아웃 및 로그인을 하면 한글 입력기가 실행됩니다.

그럼 좋은 하루 되세요 ^^)/~

요즘 만자로 리눅스(Manjaro Linux)를 주로 사용하고 있는데요, 만자로를 쓰다보면 제일 먼저 당황하는 것이 한글 입력 설정과 마우스 클릭 시 바로 실행되는 옵션입니다. 보통은 더블클릭을 해야 실행에 옮기기 때문에 이러한 기본 설정은 상당히 당황스러운데요, $HOME/.config/kdeglobals 설정 파일을 변경함으로써 처리할 수 있습니다.

$> vim ~/.config/kdeglobals

[KDE]
# 아래 라인 추가
SingleClick=false

그리고 로그아웃 후에 다시 로그인하면 마우스 클릭이 아닌 더블클릭으로 실행할 수 있습니다.

그럼 좋은 하루 되세요 >ㅁ<)-b

Arch Linux에서 커널 소스코드 다운로드 하는 법

소싯적에는 한참 Fedora만 쓰다가 최근에는 Debian으로 작업을 많이 했는데, 갑자기 이번에는 Arch Linux에 관심이 생겨서 급하게 설치를 감행하여 살펴보고 있습니다. 배포판을 여러가지 사용하다보면 각 배포판마다 독특한 특징이나 철학을 느낄 수 있는데요, Arch Linux의 경우 이런 부분이 타 배포판에 비해 두드러지는 것 같습니다. ㅠㅠ 설치가 너무 불친절한 게 단점이지만 업데이트가 엄청 빠른 건 장점이네요. 만 하루가 지났는데, 업데이트 된 패키지만 벌써 20개라는... 쿨럭..;;

일단 패키지 빌드 시 프로세서의 코어 갯수만큼 동시에 빌드를 진행하려면 /etc/makepkg.conf 파일에 아래 라인을 추가해줘야 합니다. 안그러면 커널 빌드하는데 시간이 엄청 오래 걸리더라구요. ㅠㅠ

$> sudo vi /etc/makepkg.conf

MAKEFLAGS='-j$(nproc)'

그리고 아래와 같이 순서대로 입력해서 소스코드 다운로드 -> 빌드 -> 설치를 진행할 수 있습니다.

# 소스코드 다운로드를 위해 asp 설치
$> sudo pacman -S asp

# asp로 linux 커널 소스코드 다운로드
$> asp export linux

# 패키지 빌드에 필요한 의존 패키지를 설치하면서 패키지 빌드
$> makepkg -s

# Public Key 관련 오류가 발생하면 아래와 같이 입력해서 등록해줌
$> gpg --keyserver pgp.mit.edu --recv-keys <PUB KEY>

# 빌드가 완료되면 pacman -U <패키지명>.pkg.tar.xz로 설치
$> sudo pacman -U linux-xxx.pkg.tar.xz

항상 최신을 쓴다고 생각하니 뭔가 업데이트 중 문제가 발생할 것 같은 기분이 드는데... 좀 더 써봐야 알 것 같습니다.

그럼 좋은 밤 되세요. ^^

요즘 개인적인 이유로 우분투 계열의 리눅스를 의도적으로 쓰려고 하고 있습니다. 예전에도 쓰긴 했지만 빌드 머신으로만 활용한지라... ㅠㅠ 사실 쓴다고 이야기하기도 부끄러울 정도였거든요. 그래서 열심히 써보려고 하긴 하는데, 역시나... 맨날 쓰는 것만 쓰니 마찬가지네요. ^^;;;

쓰다가보니 부팅 때마다 매번 실행하고 싶은 프로그램이 생겼는데요, 매번 실행하려니 이것도 일이더라구요. 그래서 찾아봤더니 /etc/rc.local에 실행하고 싶은 프로그램을 지정해두면 자동으로 실행할 수 있더군요. ^^ 아래처럼 말이죠.

# 매 부팅 시 /usr/test 프로그램을 자동 실행하 싶다면 /etc/rc.local에 다음과 같이 입력

/usr/test &

그럼 좋은 하루 되세요 ^^

ps) /etc/inittab에 추가하는 방법도 있습니다. respawn 옵션은 프로그램이 죽었을 때 자동으로 재실행해주는 옵션이에요 ^^)/~

MyProgram::respawn:프로그램 경로

+ Recent posts