커널 안전 기능으로 설계하는 시스템 안정성과 보안

메모리 보호와 권한 분리, 자원 격리, 형식 검증까지 커널 안전 기능이 시스템 안정성과 보안을 지키는 방식을 정리한다.

2026-08-14 · 최초 발행 2026-01-02

안전성과 보안성이 만나는 커널의 방어선

커널 안전 기능은 운영체제 내부에서 시스템 안정성, 보안성, 무결성을 유지하도록 설계한 메커니즘의 집합이다. 메모리 보호와 권한 분리, 오류 복구, 교착상태 방지, 자원 격리가 이 역할을 나눠 맡는다. 소프트웨어 버그와 하드웨어 장애뿐 아니라 악의적 행위의 영향을 제한하는 것이 목적이다.

안전성은 의도하지 않은 피해가 발생하지 않는 성질이다. 장애나 버그가 있어도 시스템이 안전한 상태를 유지하고, 동작을 예측 가능하고 결정적으로 만들려는 요구다. 비행 제어 시스템, ADAS와 자율주행, 심박조율기와 인공호흡기, 원자력 제어 시스템, 철도 신호 시스템이 안전 중요 시스템의 사례다.

보안성은 의도된 공격으로부터 시스템을 지키는 특성이다. 기밀성·무결성·가용성을 보장하고 인증, 인가, 감사를 수행한다. 안전성이 실수와 고장에 따른 피해를 줄이는 데 초점을 둔다면, 보안성은 악의적인 행위를 막는 데 초점을 둔다. 두 속성은 분리된 요구가 아니라 서로 보완된다.

보안성 (Security)안전성 (Safety)커널 안전 기능메모리 보호에러 처리교착상태 방지결정적 실행접근 제어자원 격리감사 로깅암호화

메모리 접근을 통제하는 장치

가상 메모리는 페이지 단위로 읽기·쓰기·실행 권한을 설정한다. 페이지 테이블 항목(PTE)의 권한 비트를 바탕으로 MMU(Memory Management Unit)가 하드웨어 수준에서 접근을 검사한다. 권한을 위반하면 세그멘테이션 폴트(Segmentation Fault)가 발생하며, 프로세스를 강제 종료하거나 신호를 전달해 커널 패닉으로 번지는 일을 막는다.

프로세스마다 독립적인 가상 주소 공간을 두고 페이지 테이블을 전환하는 방식도 핵심이다. 한 프로세스가 다른 프로세스의 메모리에 접근하지 못하게 하며, 사용자 모드에서는 커널 메모리에 직접 접근할 수 없다. SMAP(Supervisor Mode Access Prevention)과 SMEP(Supervisor Mode Execution Prevention)는 이 경계를 보강한다.

스택 프레임에 무작위 값을 넣고 함수 반환 전에 확인하는 Stack Canary는 스택 버퍼 오버플로우를 감지한다. NX bit(No-Execute bit)는 스택과 힙을 실행 불가 영역으로 설정해 코드 인젝션 공격을 차단한다. ASLR(Address Space Layout Randomization)은 스택, 힙, 라이브러리 주소를 무작위화해 메모리 레이아웃 예측을 어렵게 만든다.

특권을 필요한 범위로 좁히는 방식

CPU 권한 레벨은 커널 기능과 일반 프로그램을 분리한다. x86에서는 Ring 0이 커널, Ring 3이 사용자를 담당하며, ARM에서는 EL0이 사용자, EL1이 커널 권한 레벨이다. 특권 명령어는 커널 모드에서만 실행할 수 있다.

사용자 모드 프로그램은 시스템 콜을 통해 커널 서비스에 요청을 전달한다. 커널은 요청의 권한을 검사한 뒤 서비스를 제공하며, 프로그램의 직접적인 하드웨어 접근은 막는다.

Linux의 Capabilities는 root 권한을 세부 기능으로 분해한다. CAP_NET_ADMIN은 네트워크 설정, CAP_SYS_TIME은 시스템 시간 변경, CAP_DAC_OVERRIDE는 파일 권한 우회에 해당한다. 프로세스에 필요한 최소 권한만 부여하면 권한 상승(Privilege Escalation) 공격의 범위를 줄일 수 있다.

SELinux와 AppArmor는 정책에 따라 프로세스가 접근할 수 있는 자원을 제한하는 강제 접근 제어(MAC)를 제공한다. root 권한으로도 정책을 우회할 수 없다는 점이 특징이다. SELinux는 Type Enforcement와 레이블 기반 보안을 사용하며 NSA가 개발했다. AppArmor는 경로 기반 정책을 사용하고 설정이 간편하며 Ubuntu에 기본 탑재된다.

오류와 교착상태가 시스템 전체를 멈추지 않게 하려면

방어적 프로그래밍은 모든 포인터의 NULL 여부, 배열 경계, 반환값을 검사하는 데서 시작한다. 예외가 발생하면 안전 상태로 복귀해야 하며, 드라이버 오류가 커널 전체를 다운시키지 않도록 격리해야 한다. 오류를 기록하고 통보하는 처리도 이 흐름에 포함된다.

Kernel Panic은 복구할 수 없는 커널 오류로 시스템이 중단되고 재부팅 또는 정지가 필요하다. Kernel Oops는 복구 가능한 오류로, 문제 프로세스를 종료한 뒤 커널은 계속 실행할 수 있다. kdump는 커널 패닉 시 메모리 덤프를 남겨 사후 분석(Post-Mortem Analysis), 원인 파악, 디버깅에 사용한다.

교착상태는 상호 배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 순환 대기(Circular Wait)가 함께 성립할 때 발생할 수 있다. 모든 락을 정해진 순서로 획득하면 순환 대기를 방지할 수 있으며, Linux의 Lockdep은 락을 검증하는 도구다. 락 대기 시간을 제한하고 타임아웃 시 락을 해제한 뒤 재시도하는 방식도 데드락 회피에 활용된다.

락 프리 자료구조는 Atomic 연산을 이용해 락 없이 동기화한다. RCU(Read-Copy-Update)는 이 접근에 속한다.

실행 환경과 자원을 분리하는 기반

Cgroups(Control Groups)는 프로세스 그룹별로 CPU, 메모리, 디스크 I/O를 제한한다. 한 프로세스의 자원 남용이 다른 프로세스에 미치는 영향을 줄이고 OOM(Out of Memory)을 방지해 시스템 안정성을 높인다.

Namespace는 PID, Network, Mount, UTS, IPC, User Namespace를 분리해 격리된 실행 환경을 만든다. 컨테이너 기술은 이 프로세스 격리 기능을 기반으로 한다.

마감 시간을 지키는 커널 실행

Hard Real-Time 시스템은 데드라인을 반드시 준수해야 하며 실행 시간의 상한을 보장해야 한다. 항공, 자동차, 의료 기기가 해당한다. 우선순위 기반 선점 스케줄링과 우선순위 상속(Priority Inheritance)은 우선순위 역전을 막고 타이밍을 보장하는 수단이다.

RT-Preempt 패치는 Linux 커널의 실시간 패치다. 인터럽트 핸들러를 스레드화하고 스핀락을 뮤텍스로 전환해 인터럽트 지연을 낮춘다. 중요한 인터럽트부터 처리하고 네스티드 인터럽트(Nested Interrupt)를 사용하는 것도 지연을 줄이는 방식이다.

형식 검증과 안전 표준이 요구되는 환경

정리 증명(Theorem Proving)은 커널 코드의 정확성을 수학적으로 증명하고 버그가 없음을 보장한다. seL4 마이크로커널은 세계 최초의 형식 검증된 OS 커널로, C 코드와 수학적 명세의 일치를 증명했으며 보안 및 안전 중요 시스템에 사용된다.

모델 체킹(Model Checking)은 상태 공간을 탐색해 데드락과 경쟁 조건을 자동으로 검출한다. SPIN과 TLA+가 관련 도구다.

자동차 분야의 ISO 26262는 ASIL(Automotive Safety Integrity Level)을 정의한다. ASIL A는 낮음, ASIL D는 매우 높은 수준이며 자율주행 시스템은 ASIL D를 요구한다. 이 표준은 소프트웨어 개발 프로세스를 규정하고 결함 주입 테스트, 코드 커버리지 100%, 정적 분석 도구 사용을 요구한다.

항공 분야의 DO-178C는 Level A부터 E까지 구분한다. Level A는 엔진 제어처럼 비행 안전에 필수적인 기능이며, Level E는 안전과 무관하다. 구조적 커버리지가 요구된다.

산업 안전의 IEC 61508은 SIL(Safety Integrity Level) 1부터 SIL 4까지의 장애 확률 기준을 둔다. 원자력, 철도, 화학 공장이 적용 분야다.

MISRA C는 자동차, 항공, 의료 기기를 위한 안전한 C 코딩 가이드라인이다. MISRA C:2012에는 141개 규칙이 있으며 정적 분석 도구로 검증한다. 동적 메모리 할당(malloc, free), goto 문, 재귀 호출을 금지하고 모든 함수 반환값 검사를 요구한다.

장애를 감지하고 안전한 상태로 전환하는 설계

Watchdog Timer는 시스템이 주기적으로 타이머를 리셋(Kick the Watchdog)하는지 감시한다. 시스템이 응답하지 않으면 타이머가 만료되고 하드웨어 리셋이 일어난다. 소프트웨어 Watchdog은 커널 내부 타이머로 데드락과 프로세스 무응답을 감지한다. 임베디드 시스템과 서버, 라우터 같은 무인 시스템의 안정성 확보에 쓰인다.

Fail-Safe는 장애가 나면 안전한 상태로 전환해, 시스템을 중단하더라도 피해를 막는 방식이다. 철도 신호가 장애 시 빨간불로 바뀌어 정지하는 경우, 자동차 브레이크가 장애 시 작동하는 경우, 엘리베이터가 정전 시 비상 브레이크를 사용하는 경우가 이에 해당한다.

Fail-Operational은 장애가 발생해도 제한된 기능으로 시스템을 계속 동작시키는 설계다. 비행기는 엔진 2개 중 1개가 고장 나도 비행할 수 있고, 자율주행 시스템은 센서 일부가 고장 나면 안전 모드로 주행하며, RAID는 디스크 1개가 고장 나도 데이터 서비스를 유지한다.

하드웨어 이중화에는 듀얼 CPU, 메모리 ECC, RAID 디스크 이중화, 이중 전원 공급이 있다. 소프트웨어 이중화는 같은 작업을 두 번 실행해 결과를 비교하거나, 다른 팀이 같은 기능을 개발하는 N-Version Programming으로 구현할 수 있다. Active-Standby 구성은 주 시스템 장애 시 대기 시스템으로 전환해 고가용성(HA)을 제공한다.

커널 안전운영체제메모리 보호실시간 시스템형식 검증