NoWayOS
KO
GitHub
메뉴닫기

덜어 낸 설계

Single Purpose OS

다른 할 일이 없는 컴퓨터.

브라우저 없음. 데스크톱 없음. 셸 없음. 로그인 없음. 오직 한 가지 일뿐입니다. 꼭 필요한 코드로만 만들어 seL4 마이크로커널 위의 구획마다 봉인했고, Rust로 작성했습니다.

현재 QEMU와 Raspberry Pi 5에서 실행 중 · GitHub에 오픈 소스로 공개

01 / 한 가지 일 원칙

한 가지 일.나머지는 모두 뺐습니다.
원칙을 그린 그림.

여기까지 온 길

시작은 하루라도 탈이 나면 안 되는 곳들이었습니다.

처음부터 운영체제를 만들 생각은 아니었습니다. 몇몇 아주 중요한 장치를 지키려 했을 뿐인데, 그 밑에서 계속 같은 문제가 나타났습니다.

과제
한 나라가 기대어 돌아가는 시스템을 지키는 일이었습니다. 전기가 끊기지 않고 물이 깨끗하게 흐르도록 하는 제어 장치, 병원이 의지하는 네트워크, 그 데이터를 밖으로 내보내는 게이트웨이, 관제실의 단말기, 그리고 그 주변의 모든 장치, 공공장소에서 낯선 사람이 다가와 마주하는 화면까지. 하나같이 할 일은 하나였습니다. 그런데 하나같이 수천 가지 일을 하도록 만들어진 운영체제를 돌리고 있었습니다.
문제
범용 시스템은 언젠가 필요할지 모를 모든 것을 갖추고 옵니다. 브라우저, 데스크톱, 셸, 로그인, 백그라운드 서비스까지. 앱 하나만 쓰도록 잠가도 그 모든 것은 여전히 밑에 남아, 누군가 그리로 되돌아갈 길을 찾아내기를 기다립니다. 코드가 한 줄 늘 때마다 패치할 곳도, 공격받을 곳도 하나씩 늘어납니다.
전환
그래서 반대로 물었습니다. 장치에 그 한 가지 일만 담는다면 어떨까? seL4에서 출발해 그 위에 올리는 저희 코드는 모두 Rust로 작성했고, 각 부분을 저마다의 구획에 봉인했으며, 나머지는 모두 뺐습니다. 그리고 증거를 기록해 두었습니다. 누구도 저희 말만 믿을 필요가 없도록.
뜻밖의 발견
그러고 나서 주위를 둘러보았습니다. 변전소의 게이트웨이, 관제실의 단말기, 펌프 옆면의 패널, 두 네트워크 사이의 장비, 역 벽면의 디스플레이. 거의 모든 전용 장치에는 할 일이 하나뿐입니다. 핵심 기반 시설을 위한 갑옷으로 시작한 것이, 알고 보니 그 모든 장치를 더 낫게 만드는 방법이었습니다. 저희는 이것을 Single Purpose OS라고 부릅니다.

공격받을 것은 적게. 패치할 것은 훨씬 적게. 다른 할 일은 없이.

저희가 말하는 것

목적은 처음부터 담았습니다. 나머지는 모두 뺐습니다.

Single Purpose OS는 무엇이든 실행하도록 만든 뒤 한 가지로 잠근 운영체제가 아니라, 한 장치의 한 가지 일을 위해 만든 운영체제입니다. 다음 세 가지를 갖춰야 Single Purpose OS입니다.

  1. 한 가지 일을 위해 만듦

    장치 이미지에는 애플리케이션과 그 애플리케이션이 쓰는 드라이버, 그리고 커널이 들어 있습니다. 다른 일에 필요할지 모를 것은 하나도 없습니다. 브라우저도, 데스크톱도, 셸도, 패키지 관리자도, 사용자 계정도 없습니다.

  2. 구획마다 봉인

    각 부분(화면, 입력, 네트워크, 애플리케이션)은 저마다의 구획에서 실행되며, 부여받은 것에만 접근합니다. 한 부분에서 생긴 결함은 그 안에 머물도록 설계되어 있습니다.

  3. 풀이 과정을 보여 줌

    안에 무엇이 있고 각 부분이 무엇을 할 수 있는지에 대한 증거가 함께 제공됩니다. 모든 권한 부여가 기록되고, 모든 구성 요소가 나열되며, 누구나 검사를 직접 실행할 수 있습니다.

범용 시스템을 앱 하나에 잠가 두고 나머지는 그대로 남겨 두는 키오스크 모드가 아닙니다. 컴퓨터 안에 무엇이 있는지가 아니라 누가 쓰는지를 제한하는 단일 사용자 OS도 아닙니다.

없는 것들

더 적은 소프트웨어. 설계부터 그렇게.

대부분의 전용 장치는 범용 시스템 위에 애플리케이션 하나를 얹어 돌리고, 나머지는 모두 그 밑에 그대로 남아 있습니다. NoWayOS는 할 일에서 출발해 필요한 것만 더하고 나머지는 뺍니다. 그 차이는 이렇습니다.

처음부터 넣지 않은 것은 악용할 길도 없습니다.
잠금 설정한 일반적인 장치NoWayOS 장치
웹 브라우저와 JavaScript 엔진포함넣지 않음
데스크톱과 윈도 시스템포함넣지 않음
셸과 명령줄포함넣지 않음
패키지 관리자포함넣지 않음
사용자 계정과 로그인포함넣지 않음
백그라운드 서비스포함넣지 않음
이 모두를 잠그기 위한 설정포함넣지 않음
커널범용: 수천만 줄seL4: 약 10,000줄
드라이버마주칠지 모를 하드웨어용실제로 쓰는 하드웨어용만
여러분의 애플리케이션포함포함
처음부터 넣지 않은 것은 악용할 길도 없습니다.

Screen Compiler

React를 좋아하시죠. 저희도 그렇습니다.

익숙한 작업 방식 그대로 풍부하고 현대적인 인터페이스를 만들고 싶으신가요? 화면은 React로 작성하십시오. Screen Compiler가 이를 NoWayOS에서 바로 실행되는 네이티브 Rust 컴포넌트로 바꿉니다. 브라우저도, JavaScript도, 공격받을 웹 페이지도 없습니다.

  • 도구는 그대로: 컴포넌트, props, 디자인 토큰, 그리고 지금 쓰는 에디터까지.
  • 제대로 된 구성 요소: 레이아웃, 텍스트, 버튼, 텍스트 입력, 체크박스, 라디오 그룹, 카드, 알림, 진행률 표시줄, 아이콘.
  • 정확하거나, 아예 하지 않거나. 지원하는 부분 집합은 정확히 변환하고, 그 밖의 것은 파일, 줄, 열을 밝혀 거부합니다. 절대 추측하지 않습니다.
  • 픽셀 단위까지 검사. 변환된 모든 화면은 NoWayOS가 직접 그려, 승인된 이미지와 비교합니다.

첫 화면을 Rust로 바꿔 보기

React 입력
<Column gap={SPACE_SM} padding={SPACE_LG}>
  <Text id="title">Welcome</Text>
  <Text>Touch Start to begin.</Text>
  <Button id="start" onPress={onStart}>
    Start
  </Button>
</Column>
Rust 출력
let n1 = b.text("Welcome")?; // welcome.tsx:17:9
let n2 = b.text("Touch Start to begin.")?;
let n5 = b.button("Start", actions::START)?;
let n0 = b.column(
    ui::Layout::new()
        .gap(super::tokens::SPACE_SM)
        .padding(super::tokens::SPACE_LG),
    &[n1, n2, n5],
)?;

Screen Compiler의 테스트 화면 하나와 그로부터 생성된 Rust 코드를 줄여 실었습니다.

왜 중요한가

할 일은 하나. 그거면 충분합니다.

한 가지 일만을 위해 컴퓨터를 만들면, 완전히 다르게 만들 수 있습니다. 그로써 얻는 것은 이렇습니다.

  • 더 안전하게

    처음부터 넣지 않은 것은 악용할 길도 없습니다.

    • 브라우저 엔진도, 윈도 시스템도, 셸도, 패키지 관리자도, 사용자 계정도 없습니다. 이미지에 없는 것은 장치를 공격하는 데 쓰일 수 없습니다.
    • 화면, 입력, 네트워크, 그리고 여러분의 애플리케이션은 각자 봉인된 구획에 머물며 부여받은 것에만 접근합니다. 한 부분의 결함이 그 부분 안에 머물도록 만들어져 있습니다.
    • 그 중심에는 seL4가 있습니다. seL4 재단은 seL4를 “세계에서 가장 높은 수준으로 보증되고 가장 빠른 운영체제 커널”이라고 부릅니다.
    • 처음부터 끝까지 Rust. unsafe 코드는 검토를 거친 소수의 크레이트에만 있으며, 빌드가 그 목록을 강제합니다.
  • 더 효율적으로

    노는 것도, 방해하는 것도 없습니다.

    • 백그라운드 서비스도, 쓰지도 않는 소프트웨어를 위한 업데이트 프로그램도 없습니다. 전원을 켜면 곧바로 자기 일을 시작합니다.
    • 모든 바이트는 빌드할 때 정해집니다. 각 부분은 정해진 양의 메모리를 받고, 그 이상은 결코 가져갈 수 없습니다. 장치 코드 대부분은 메모리를 전혀 할당하지 않으며, TLS 클라이언트조차 고정된 예산을 받습니다. 예산을 다 쓰면 더 늘어나는 대신 깔끔하게 멈춥니다.
    • 바뀐 부분만 다시 그리는 선명한 네이티브 인터페이스. Raspberry Pi 5 같은 저렴한 하드웨어에서도 제 실력을 냅니다.
  • 다루기 쉽게

    언어 하나. 컨테이너 하나. 에뮬레이터 먼저.

    • 드라이버부터 사용자 인터페이스까지 Rust.
    • 화면은 React로 디자인하십시오. Screen Compiler가 빌드할 때 네이티브 Rust로 바꿔 줍니다. 장치에 브라우저 엔진도 JavaScript도 없는 현대적인 인터페이스입니다. 물론 Rust로 직접 작성해도 됩니다.
    • 툴체인, seL4 Microkit SDK, QEMU가 버전이 고정된 개발 컨테이너 하나에 담겨 있습니다. 여러분의 컴퓨터에는 Podman과 make, 그리고 Raspberry Pi를 다룰 Python만 있으면 됩니다.
  • 증명하기 쉽게

    모든 권한 부여는 기록으로. 모든 이미지는 명세로.

    • 시스템이 부여하는 모든 케이퍼빌리티는 파일에 나열되며, 둘이 어긋나면 빌드가 실패합니다.
    • 모든 이미지에는 소프트웨어 자재 명세서와 seL4 구성 기록이 함께 제공됩니다.
    • 모든 메시지 디코더가 패닉, 오버플로, 범위 밖 읽기를 일으키지 않는다는 유계 증명에 더해 퍼징, 라이선스 및 보안 권고 검사까지. 하나하나가 직접 실행해 볼 수 있는 명령입니다.

모든 것이 걸려 있다면, 한 가지 일만 맡기십시오.

어떤 장치의 일은 너무 중요해서 다른 일에 한눈팔 여유가 없습니다. 전력망의 제어 장치, 정수장에서 바깥으로 나가는 게이트웨이, 관제실의 단말기, 두 네트워크 사이의 경계가 그렇습니다. NoWayOS는 각 장치가 수행해야 할 역할을 중심으로 설계되었으며, 그 안에 무엇이 있는지 이해하도록 돕는 증거를 함께 제공합니다.

수식어가 아닌 증거

제 할 일만 합니다. 직접 확인해 보십시오.

보안 주장의 가치는 그 뒤에 있는 증거만큼입니다. NoWayOS는 증거를 기록해 두며, 그 하나하나가 여러분이 직접 실행할 수 있는 명령에서 나옵니다.

  • 모든 권한 부여를 기록

    각 시스템의 권한 부여 파일에는 그 시스템이 부여하는 모든 우선순위, 메모리 영역, 장치, 인터럽트, 채널이 나열됩니다. 시스템과 목록이 어긋나면 빌드가 실패합니다.

  • 실패까지 시험하는 격리

    격리 테스트는 부여받지 않은 것에 손을 뻗고, seL4는 이를 막아야 합니다. 일부러 권한 부여를 넓힌 변형은 반드시 실패해야 하며, 이로써 테스트가 실제로 실패할 수 있음을 보여 줍니다.

  • 모든 이미지를 항목별로

    모든 이미지에 CycloneDX 소프트웨어 자재 명세서가 있습니다. 커널, 로더, 각 보호 도메인과 그 안의 크레이트까지, 저마다 해시와 함께 기록됩니다.

  • 손닿지 않는 곳에 둔 관문

    모든 기여가 통과해야 하는 검사는 별도의 공개 저장소인 Defence Agent에 있으며, 관문을 건드리는 풀 리퀘스트는 표시되어 메인테이너에게 전달됩니다.

실제 이미지 하나의 증거 읽기

공개 개발

프로젝트 넷. 저마다 할 일은 하나.

네 프로젝트 모두 오픈 소스이며, GitHub의 NoWayOS 조직 아래에서 공개적으로 개발합니다. 직접 클론하고, 빌드하고, 모든 줄을 확인해 보십시오.

  • NoWayOS

    Single Purpose OS.

    seL4와 Microkit 기반의 보호 도메인 패턴, 타입 지정 메시지, 드라이버, 네트워킹, 네이티브 사용자 인터페이스, 그리고 모든 NoWayOS 저장소가 빌드에 쓰는 개발 컨테이너와 검사 도구.

    상태
    개발 중
    라이선스
    MIT OR Apache-2.0
    GitHub의 NoWayOS
  • Screen Compiler

    디자인은 React로. 출시는 네이티브 Rust로. 장치에는 브라우저 없이.

    선언된 부분 집합에 맞춰 TSX로 작성한 React 화면을 NoWayOS 사용자 인터페이스용 Rust로 변환합니다. 빌드할 때 여러분의 컴퓨터나 CI에서 실행되며, 제품에 실려 나가지 않습니다.

    상태
    개발 중: 부분 집합 v0과 v1의 첫 부분
    라이선스
    MIT
    GitHub의 Screen Compiler
  • Showcase

    Raspberry Pi에서 실행해 볼 수 있는 보안 애플리케이션.

    보안 셀프서비스 화면을 위한 키트, 그 위에 쌓아 올릴 참조 애플리케이션, 그리고 Raspberry Pi 5가 부팅하면 뜨는, 가상 브랜드로 꾸민 예제 런처.

    상태
    초기 단계이며 배포할 수 없음
    라이선스
    MIT OR Apache-2.0
    GitHub의 Showcase
  • Defence Agent

    모든 기여가 통과해야 하는 관문을, 풀 리퀘스트의 손이 닿지 않는 곳에.

    NoWayOS의 공개 프로젝트에 대한 변경이 통과해야 하는 모든 보안 관문을, 각 관문이 대응하는 위협과 그 관문을 바꿀 수 있는 사람과 함께 기록해 두었고, 관문을 실행하는 에이전트도 이곳에 있습니다. 풀 리퀘스트는 자신을 심사하는 것을 절대 바꾸거나 제공하지 않습니다.

    상태
    공개됨: 관문은 기록을 마쳤고, 에이전트와 도구는 다음 차례입니다
    라이선스
    MIT OR Apache-2.0
    GitHub의 Defence Agent

프로젝트 더 알아보기

상용 파트너

NoWayOS 위에 만든 상용 제품.

NoWayOS의 후원사인 Adappt.ai는 NoWayOS의 첫 상용 파트너입니다. Adappt.ai는 NoWayOS 위에 두 가지 상용 제품을 만들고 있으며, 둘 다 개발 중입니다.

상용 파트너가 되는 데 관심이 있으신가요? partners@nowayos.com으로 이메일 보내기

Remote Desktop
한층 단단해진 화면. 원격 Windows 데스크톱을 위한 보안 스테이션으로, 연결을 별도의 구획에 봉인하고 자격 증명은 그 연결이 닿지 않는 곳에 두도록 설계되었습니다.
Data Diode
되돌아올 길은 없습니다. 보호된 네트워크에서 데이터를 내보내기 위한 단방향 경계로, 빛을 한 방향으로만 전달하는 링크를 중심으로 설계되었습니다.

현재 상황

지금 실행됩니다. 아직 완성은 아닙니다.

NoWayOS는 개발 중이며 아직 프로덕션에 쓸 준비가 되지 않았고, API는 바뀔 것입니다. 지금 실행되는 것과 다음에 올 것을 정리했습니다.

QEMU에서
첫 보호 도메인부터 DHCP 임대를 받는 네트워크 스택, 슈퍼바이저의 페일세이프 상태, 클릭할 수 있는 사용자 인터페이스까지, 50개가 넘는 시스템이 부팅해 자신의 출력을 스스로 검사합니다.
Raspberry Pi 5에서
HDMI 화면의 사용자 인터페이스, USB 키보드와 마우스, 타이머, 워치독, 슈퍼바이저의 재설정이 모두 보드에서 동작합니다. 보드의 더 많은 하드웨어를 살려 내는 작업이 진행 중입니다.
앞으로 할 일
보안 부팅, 장치에서 적용하는 서명된 업데이트, 그리고 산업용 하드웨어(NXP i.MX8).
seL4의 증명
모든 시스템은 seL4 위에서 실행되지만, seL4의 완료된 증명이 다루는 구성을 쓰는 NoWayOS 이미지는 아직 없습니다. 각 이미지는 자신이 쓰는 구성을 기록합니다.

작업 따라가기

목적은 하나. 살펴볼 것은 많습니다.

설계부터 살펴보거나, 증거를 점검하거나, 개발자 가이드로 첫 시스템을 만들어 보십시오. 참고로 이 사이트도 같은 규칙을 지킵니다. 스크립트도, 쿠키도, 다른 할 일도 없습니다.