<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
  <title>NoWayOS 저널</title>
  <subtitle>NoWayOS를 어떻게, 왜 만드는지. Single Purpose OS를 만들며 겪은 이야기로, 모두 사실이며 대부분은 직접 확인할 수 있습니다.</subtitle>
  <link href="https://www.nowayos.com/ko/journal/feed.xml" rel="self"/>
  <link href="https://www.nowayos.com/ko/journal"/>
  <id>https://www.nowayos.com/ko/journal</id>
  <updated>2026-11-13T00:00:00Z</updated>
  <author><name>NoWayOS</name><uri>https://www.nowayos.com/ko</uri></author>
  <entry>
    <title>React로 쓰고, Rust로 내보내다</title>
    <link href="https://www.nowayos.com/ko/journal/react-in-rust-out"/>
    <id>https://www.nowayos.com/ko/journal/react-in-rust-out</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>디자이너는 React를 그대로 씁니다. 장치는 네이티브 Rust를 받습니다. Screen Compiler가 빌드 시점에 화면을 코드로 바꾸어, 장치에 공격할 브라우저가 없도록 하는 방법을 소개합니다.</summary>
    <content type="html">&lt;p&gt;현대의 인터페이스는 React로 설계됩니다. 그래서 제어 패널부터 발권기까지 아주 많은 전용 장치가 브라우저 엔진을 통째로 싣고 있습니다. 세상에서 가장 크고 가장 많이 공격받는 프로그램 가운데 하나를, 버튼 몇 개와 “Touch Start to begin”이라는 글자를 그리기 위해서 말입니다.&lt;/p&gt;
&lt;p&gt;저희는 브라우저 없이 현대적인 디자인 작업 방식을 쓰고 싶었습니다. 그래서 &lt;strong&gt;Screen Compiler&lt;/strong&gt;를 만들었습니다.&lt;/p&gt;
&lt;h2 id=&quot;화면은-react로-작성합니다&quot;&gt;화면은 React로 작성합니다&lt;/h2&gt;
&lt;p&gt;디자이너와 프런트엔드 개발자는 쓰던 도구를 그대로 씁니다. 컴포넌트, props, 디자인 토큰, 쓰던 편집기까지. 화면은 TSX로 작성합니다(아래는 Screen Compiler의 테스트 화면 가운데 하나를 줄인 것입니다).&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&amp;lt;Column gap={SPACE_SM} padding={SPACE_LG}&amp;gt;
  &amp;lt;Text id=&amp;quot;title&amp;quot;&amp;gt;Welcome&amp;lt;/Text&amp;gt;
  &amp;lt;Text&amp;gt;Touch Start to begin.&amp;lt;/Text&amp;gt;
  &amp;lt;Spacer /&amp;gt;
  &amp;lt;Button id=&amp;quot;start&amp;quot; onPress={onStart}&amp;gt;Start&amp;lt;/Button&amp;gt;
&amp;lt;/Column&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;내보내는-것은-평범한-rust입니다&quot;&gt;내보내는 것은 평범한 Rust입니다&lt;/h2&gt;
&lt;p&gt;빌드 시점에, 사용자의 컴퓨터나 CI에서, Screen Compiler는 이것을 NoWayOS의 사용자 인터페이스 런타임용 Rust로 바꿉니다.&lt;/p&gt;
&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-rust&quot;&gt;let n1 = b.text(&amp;quot;Welcome&amp;quot;)?; // welcome.tsx:17:9 &amp;lt;Text&amp;gt;
let n2 = b.text(&amp;quot;Touch Start to begin.&amp;quot;)?; // welcome.tsx:18:9 &amp;lt;Text&amp;gt;
let n4 = b.spacer(None)?; // welcome.tsx:20:9 &amp;lt;Spacer&amp;gt;
let n5 = b.button(&amp;quot;Start&amp;quot;, actions::START)?; // welcome.tsx:21:9 &amp;lt;Button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모든 줄은 자신이 나온 TSX의 위치를 가리킵니다. 장치는 이 코드만 받습니다. JavaScript 엔진도, 브라우저도, 공격할 웹 페이지도 없습니다. Screen Compiler 자체는 장치에 실리지 않습니다.&lt;/p&gt;
&lt;!-- slot --&gt;&lt;h2 id=&quot;정확하게-아니면-아예-하지-않습니다&quot;&gt;정확하게, 아니면 아예 하지 않습니다&lt;/h2&gt;
&lt;p&gt;짐작으로 변환하는 변환기는 믿을 수 없습니다. Screen Compiler는 선언된 TSX 부분집합을 정확하게 변환하고, 그 밖의 것은 모두 파일, 줄, 열을 밝히며 거부합니다. 근사치로 처리하는 일은 없습니다. 생성하는 Rust에는 &lt;code&gt;unsafe&lt;/code&gt;도, &lt;code&gt;unwrap&lt;/code&gt;도, &lt;code&gt;panic&lt;/code&gt;도 없습니다.&lt;/p&gt;
&lt;p&gt;그런 다음 변환된 모든 화면을 NoWayOS의 렌더러로 그려, 승인된 이미지와 픽셀 단위로 비교합니다. 픽셀 하나라도 움직이면 빌드가 알려 줍니다.&lt;/p&gt;
&lt;h2 id=&quot;현재-상태&quot;&gt;현재 상태&lt;/h2&gt;
&lt;p&gt;Screen Compiler는 개발 중입니다. 첫 번째 부분집합은 만들어졌고, 다음 부분집합을 진행하고 있습니다. MIT 라이선스의 오픈 소스이며, GitHub에서 NoWayOS와 나란히 공개되어 있습니다. React로 설계하고 중요한 장치를 만드는 팀이라면, &lt;a href=&quot;mailto:partners@nowayos.com&quot;&gt;연락을 기다리겠습니다&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>복사본이 아니었던 백업</title>
    <link href="https://www.nowayos.com/ko/journal/the-backup-that-wasnt-a-copy"/>
    <id>https://www.nowayos.com/ko/journal/the-backup-that-wasnt-a-copy</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>아폴로 11호는 서로 다른 원리로 만든 유도 시스템 두 개를 싣고 비행했고, 둘 다 필요했습니다. 아리안 5는 똑같은 시스템 두 개를 싣고 비행했고, 폴트 하나가 둘 다 멈췄습니다. 이 차이에는 이름이 있고, NoWayOS는 그 올바른 쪽에 서도록 만들어졌습니다.</summary>
    <content type="html">&lt;p&gt;백업이 있어야 한다는 것은 누구나 압니다. 하지만 그다음의 불편한 질문을 하는 사람은 많지 않습니다. 정확히 &lt;em&gt;무엇의&lt;/em&gt; 백업입니까?&lt;/p&gt;
&lt;h2 id=&quot;다섯-번의-경보&quot;&gt;다섯 번의 경보&lt;/h2&gt;
&lt;p&gt;1969년 7월 20일, 아폴로 11호의 달 착륙선이 달 표면까지 몇 분을 남겨 두었을 때, 유도 컴퓨터가 경보를 울렸습니다. 승무원이 관제 센터에 물어봐야 했던 경보였습니다. 그리고 또 한 번. 하강의 마지막 구간에서 모두 다섯 번이었습니다.&lt;/p&gt;
&lt;p&gt;컴퓨터는 과부하 상태였습니다. 그다음에 컴퓨터가 한 일은 이 이야기에서 손꼽히는 공학적 성취입니다. 매번 다시 시작했고, 미룰 수 있는 작업은 버렸으며, 미룰 수 없는 작업은 곧바로 이어받았습니다. 착륙은 계속되었습니다.&lt;/p&gt;
&lt;p&gt;여기까지는 누구나 하는 이야기입니다. 그다음에 할 만한 이야기는 이튿날 일어났습니다.&lt;/p&gt;
&lt;h2 id=&quot;두-번째-시스템&quot;&gt;두 번째 시스템&lt;/h2&gt;
&lt;p&gt;달 착륙선에는 두 번째 유도 시스템이 실려 있었고, 그것은 첫 번째의 예비 복사본이 아니었습니다. 다른 회사가, 다른 원리로 만들었습니다. 주 시스템은 짐벌 위에서 자유롭게 도는 플랫폼으로 자세 기준을 유지했습니다. 두 번째에는 짐벌이 아예 없었습니다. 센서가 우주선에 직접 고정되어 있었고, 어느 쪽이 위인지는 계산으로 알아냈습니다.&lt;/p&gt;
&lt;p&gt;그 시스템은 주 시스템이 멈출 경우 승무원을 궤도로 데려가기 위해 있었습니다. 착륙하는 동안에는 쓰이지 않았습니다.&lt;/p&gt;
&lt;p&gt;그런데 사령선과 도킹하러 다시 올라가는 길에, 일련의 기동이 주 시스템의 플랫폼을 짐벌 방식 플랫폼이 감당하지 못하는 단 하나의 자세로 몰고 갔고, 주 시스템은 자세 기준을 잃었습니다. 승무원은 우주선을 안정시키기 위해 두 번째 시스템으로 전환했고, 도킹했습니다.&lt;/p&gt;
&lt;p&gt;두 번째 시스템은 같은 방식으로 고장 날 수 없었습니다. 그 부품이 없었기 때문입니다.&lt;/p&gt;
&lt;h2 id=&quot;똑같은-것-두-개&quot;&gt;똑같은 것 두 개&lt;/h2&gt;
&lt;p&gt;이제 다른 이야기입니다. 1996년, 첫 번째 아리안 5는 자신이 어느 쪽을 향하는지 알려 주는 관성 기준 장치 두 대를 싣고 이륙했습니다. 한 대는 작동 중이었고, 한 대는 대기 중이었습니다. 두 대는 소프트웨어까지 똑같았습니다.&lt;/p&gt;
&lt;p&gt;삼십칠 초 뒤, 그 소프트웨어 안의 숫자 하나가 할당된 공간에 담기에는 너무 커졌습니다. 대기 중이던 장치가 멈췄습니다. 같은 비행에서 같은 코드를 실행하던 작동 중인 장치도 멈췄습니다. 조사 위원회의 보고서는 공개되어 있고, 단호하게 말합니다. 전환할 곳이 없었습니다. 백업이 이미 같은 길을 갔기 때문입니다.&lt;/p&gt;
&lt;p&gt;복사본 두 개. 폴트 하나. 남은 것은 없었습니다.&lt;/p&gt;
&lt;h2 id=&quot;엔지니어들이-부르는-이름&quot;&gt;엔지니어들이 부르는 이름&lt;/h2&gt;
&lt;p&gt;시스템과 그 예비를 함께 쓰러뜨리는 폴트를 &lt;em&gt;공통 원인 고장&lt;/em&gt;이라고 합니다. 그에 대한 방어가 &lt;em&gt;다양성 다중화&lt;/em&gt;입니다. 첫 번째를 멈추는 것이 두 번째에는 들어 있지 않을 만큼 다르게 만든 두 번째 시스템입니다.&lt;/p&gt;
&lt;p&gt;우주왕복선이 이렇게 비행했습니다. 비행 컴퓨터 가운데 네 대는 한 회사의 소프트웨어를 실행했고, 다섯 번째는 다른 회사가 따로 작성한 소프트웨어를 실행했습니다. 복사본 네 개는 고장 나는 컴퓨터로부터 지켜 줍니다. 잘못된 프로그램으로부터는 지켜 주지 못합니다. 네 대 모두 그 프로그램을 실행하고 있기 때문입니다.&lt;/p&gt;
&lt;p&gt;공짜는 아닙니다. 우주왕복선의 첫 발사는 다섯 번째 컴퓨터와 나머지 네 대가 시각을 맞추지 못해 취소되었습니다. 설계 두 개는 하나보다 일이 많고, 둘을 서로 맞물리게 해야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;nowayos의-자리&quot;&gt;NoWayOS의 자리&lt;/h2&gt;
&lt;p&gt;오늘날 대부분의 전용 장치는 몇 안 되는 범용 운영체제 가운데 하나를 실행합니다. 그 백업도 마찬가지입니다. 브라우저 엔진이나 데스크톱, 수천만 줄짜리 커널에서 결함이 발견되거나 잘못된 업데이트가 배포되면, 그 소프트웨어가 실행되는 모든 곳에서, 같은 날에 문제가 나타납니다.&lt;/p&gt;
&lt;p&gt;NoWayOS 장치는 속이 다릅니다. 커널은 seL4이고, 약 10,000줄입니다. 그 위에 있는 저희 코드는 모두 Rust로 작성했습니다. 브라우저 엔진도, 데스크톱도, 셸도 없으므로, 그 가운데 하나에 있는 결함은 이 장치에 없습니다.&lt;/p&gt;
&lt;p&gt;따라서 NoWayOS는 지금 운영하시는 것을 대체하지 않아도 쓸모가 있습니다. 그 옆에 설 수 있습니다. 꼭 필요한 한 가지 일을 하는, 다른 원리로 만든 두 번째 방법으로서입니다.&lt;/p&gt;
&lt;h2 id=&quot;하지-못하는-것&quot;&gt;하지 못하는 것&lt;/h2&gt;
&lt;p&gt;다양성에는 한계가 있고, 그 한계는 저희가 직접 말씀드리고 싶습니다.&lt;/p&gt;
&lt;p&gt;다양성은 NoWayOS 장치에 다른 폴트를 줄 뿐, 폴트가 없게 해 주지는 않습니다. 두 시스템이 공유하는 것에는 아무 효과가 없습니다. 전원, 네트워크, 그 뒤의 서비스, 또는 그 일이 본래 무엇이어야 했는지에 대한 오류입니다. 그리고 NoWayOS의 오픈 소스 구성 요소 가운데 일부는 다른 소프트웨어에서도 쓰입니다. 그래서 모든 이미지는 포함된 구성 요소를 빠짐없이 나열하며, 옆의 시스템과 무엇을 공유하는지 직접 읽어 보실 수 있습니다.&lt;/p&gt;
&lt;p&gt;NoWayOS는 개발 중이므로, 이것은 NoWayOS가 맡도록 설계된 역할이지 이미 수행한 역할이 아닙니다. &lt;a href=&quot;/ko/security#diverse-redundancy&quot;&gt;그 근거는 보안 페이지에 있습니다&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;아폴로의 엔지니어들이 두 번째 시스템을 실은 것은 첫 번째가 고장 날 것으로 예상했기 때문이 아닙니다. 고장 나지 않는다는 것을 증명할 수 없었기 때문입니다. 그리고 첫 번째를 멈추는 것이 두 번째 안에서 낯익은 것을 하나도 찾지 못하도록 했습니다.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>변경할 때마다 저희 빌드를 직접 공격합니다</title>
    <link href="https://www.nowayos.com/ko/journal/we-attack-our-own-build"/>
    <id>https://www.nowayos.com/ko/journal/we-attack-our-own-build</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>실패할 수 없는 보안 테스트는 아무것도 보여 주지 못합니다. 그래서 NoWayOS의 테스트에는 실패하도록 만든 버전이 함께 있고, 게이트는 풀 리퀘스트가 닿을 수 없는 곳에 있습니다.</summary>
    <content type="html">&lt;p&gt;어떤 보안 테스트에든 불편한 질문이 하나 있습니다. 그 테스트는 실패한 적이 있습니까? 한 번도 실패한 적 없는 테스트가 통과하는 이유는 시스템이 건전해서일 수도 있고, 테스트가 아무것도 보지 못해서일 수도 있습니다. 밖에서 보면 둘은 완전히 똑같아 보입니다.&lt;/p&gt;
&lt;p&gt;그래서 NoWayOS는 보안을 테스트하는 데서 그치지 않습니다. 변경할 때마다 보안을 공격하고, 그 공격이 막히는지 확인합니다.&lt;/p&gt;
&lt;h2 id=&quot;내-것이-아닌-것에-손을-뻗기&quot;&gt;내 것이 아닌 것에 손을 뻗기&lt;/h2&gt;
&lt;p&gt;NoWayOS 시스템의 각 부분은 seL4 위의 자기 구획에서 실행되며, 부여받은 것만 가집니다. 격리 테스트는 그 경계를 넘는 프로브를 일부러 보냅니다. 어떤 프로브는 받은 적 없는 주소를 읽습니다. 어떤 프로브는 읽기만 허용된 페이지에 씁니다. 사용자 인터페이스가 가진 것과 정확히 같은 것을 가진 프로브는, 인터페이스가 읽기만 할 수 있는 디스플레이 제어 페이지에 쓰려고 합니다. 네트워크 클라이언트가 가진 것과 정확히 같은 것을 가진 또 다른 프로브는 네트워크 드라이버의 메모리에 쓰려고 합니다.&lt;/p&gt;
&lt;p&gt;seL4는 이 모두를 막아야 하고, 관계없는 부분은 아무 영향 없이 계속 실행되어야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;실패하도록-만든-테스트&quot;&gt;실패하도록 만든 테스트&lt;/h2&gt;
&lt;p&gt;여기에 반전이 있습니다. 사용자 인터페이스의 격리 테스트 옆에는 권한 부여 하나를 일부러 넓힌 변형이 있습니다. 인터페이스의 대역에게 디스플레이의 비공개 페이지를 주는 것입니다. 이 변형의 테스트는 &lt;strong&gt;반드시 실패해야 합니다&lt;/strong&gt;. 만약 통과한다면 격리 테스트는 아무것도 보지 못하는 것이고, 빌드가 그렇게 알려 줍니다.&lt;/p&gt;
&lt;p&gt;같은 생각이 나머지 검사에도 이어집니다. 부분 사이 메시지의 모든 디코더에는 패닉, 오버플로, 범위 밖 읽기를 일으키지 않는다는, 모델 검사기 Kani의 유계 증명이 있습니다. 그런 다음 뮤테이션 검사가 디코더를 일부러 망가뜨려, 증명이 이를 알아차린다는 것을 보입니다. 외부 입력의 모든 파서는 적대적인 데이터로 퍼징합니다.&lt;/p&gt;
&lt;p&gt;이 모두가 모든 변경이 통과해야 하는 게이트인 &lt;code&gt;make ci&lt;/code&gt;의 일부입니다. 격리 테스트는 매번 실행되고, 증명이나 퍼징은 그것이 다루는 코드가 바뀔 때마다 다시 실행됩니다.&lt;/p&gt;
&lt;!-- slot --&gt;&lt;h2 id=&quot;손이-닿지-않는-게이트&quot;&gt;손이 닿지 않는 게이트&lt;/h2&gt;
&lt;p&gt;게이트는 그것을 바꿀 수 있는 손만큼만 강합니다. 그래서 NoWayOS에 대한 모든 기여가 통과해야 하는 검사는 별도의 공개 저장소인 &lt;strong&gt;Defence Agent&lt;/strong&gt;에 정의되어 있습니다. 게이트를 건드리는 풀 리퀘스트는 메인테이너가 볼 수 있도록 표시됩니다.&lt;/p&gt;
&lt;p&gt;Defence Agent는 자기 자신도 같은 방식으로 테스트합니다. 리뷰어가 놓칠 만한 것을 하나씩 숨긴, 심어 둔 풀 리퀘스트 스무 개입니다. 주석 안에 숨겨진 오른쪽에서 왼쪽으로 쓰는 텍스트, 닮은꼴 키릴 문자로 바꿔 넣은 글자 하나, git 저장소에서 직접 가져오는 의존성, 신뢰할 수 없는 코드를 실행하게 될 워크플로가 있습니다. 이들은 모두 잡혀야 하고, 실제 과거 변경 세 건은 통과해야 합니다.&lt;/p&gt;
&lt;h2 id=&quot;형용사가-아니라-증거&quot;&gt;형용사가 아니라 증거&lt;/h2&gt;
&lt;p&gt;이 가운데 어느 것도 장치를 “해킹 불가능”하게 만들지 않습니다. 그런 것은 없으며, 저희는 결코 그렇게 말하지 않겠습니다. 대신 증거를 드립니다. 무엇을 시도했고 무엇이 막혔는지의 기록, 그리고 그것을 보여 주는 명령입니다. &lt;a href=&quot;/ko/security#read-one-images-evidence&quot;&gt;실제 이미지 하나의 증거&lt;/a&gt;나 &lt;a href=&quot;https://github.com/NoWayOS/defence-agent&quot;&gt;게이트 자체&lt;/a&gt;를 읽어 보십시오.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>증명이 약속할 수 있는 것</title>
    <link href="https://www.nowayos.com/ko/journal/what-a-proof-can-promise"/>
    <id>https://www.nowayos.com/ko/journal/what-a-proof-can-promise</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>테스트는 누군가 떠올린 경우를 시험합니다. 증명은 모든 경우를 다룹니다. seL4의 수학적 증명이 무엇을 말하고, 무엇을 가정하며, NoWayOS는 그 옆 어디에 서 있는지 설명합니다.</summary>
    <content type="html">&lt;p&gt;소프트웨어를 신뢰하는 이유는 대개 테스트를 거쳤기 때문입니다. 누군가 잘못될 수 있는 경우를 떠올리고, 시험해 보고, 소프트웨어가 버텨 내는 것을 확인했습니다. 이 방법은 잘 통합니다. 아무도 떠올리지 못한 경우를 만나기 전까지는 말입니다.&lt;/p&gt;
&lt;p&gt;증명은 반대쪽에서 출발합니다. 경우를 시험하지 않습니다. 어떤 명제가 모든 경우에 성립한다는 것을 수학으로 보입니다.&lt;/p&gt;
&lt;h2 id=&quot;시험해-본-경우가-아니라-모든-경우&quot;&gt;시험해 본 경우가 아니라 모든 경우&lt;/h2&gt;
&lt;p&gt;작은 약속 하나를 예로 들겠습니다. 이 코드는 버퍼의 끝을 넘어 읽지 않는다는 약속입니다. 테스트는 입력을 천 개, 또는 십억 개 넣어 보고, 그중 어느 것도 코드를 무너뜨리지 못했다고 보고할 수 있습니다. 증명은 종류가 다른 말을 합니다. 코드를 무너뜨리는 입력은 없다는 것입니다. 찾지 못한 것이 아니라, 존재하지 않습니다.&lt;/p&gt;
&lt;p&gt;그 대가는 엄밀함입니다. 증명에는 코드가 무엇을 해야 하는지를 정확히 적은 진술, 곧 명세가 필요하고, 코드의 모든 줄을 명세와 잇는 논증이 필요합니다. 실제 소프트웨어에서 그 논증은 사람이 눈으로 확인하기에는 너무 깁니다. 그래서 컴퓨터가 검사합니다.&lt;/p&gt;
&lt;!-- slot --&gt;&lt;h2 id=&quot;기계가-검사한-증명&quot;&gt;기계가 검사한 증명&lt;/h2&gt;
&lt;p&gt;“기계 검사”란 바로 그런 뜻입니다. 증명은 증명 보조기라는 프로그램이 읽을 수 있는 언어로 빠짐없이 작성되고, 그 프로그램이 각 단계를 논리 규칙에 비추어 검사합니다. 구백 번째 쪽에서 지치지 않고, 누구의 말도 그대로 믿지 않습니다.&lt;/p&gt;
&lt;p&gt;seL4의 증명은 Isabelle/HOL이라는 증명 보조기에서 이렇게 검사됩니다. 증명은 공개되어 있고, 누구나 다시 실행해 볼 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;sel4의-증명이-말하는-것&quot;&gt;seL4의 증명이 말하는 것&lt;/h2&gt;
&lt;p&gt;seL4는 모든 NoWayOS 시스템이 그 위에서 실행되는 커널입니다. 약 10,000줄의 코드이며, 장치를 완전히 제어하는 유일한 코드입니다. 핵심은 그 크기입니다. 만 줄에 대한 논증은 끝까지 마칠 수 있습니다. 수천만 줄에 대한 논증은 아직 그럴 수 없습니다.&lt;/p&gt;
&lt;p&gt;seL4 Foundation은 &lt;a href=&quot;https://sel4.systems/Verification/proofs.html&quot;&gt;이 증명들&lt;/a&gt;을 층으로 나누어 설명합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;코드는 명세가 말하는 대로 동작하고, 그 이상은 하지 않습니다.&lt;/strong&gt; 여기서 커널이 할 수 없는 일의 목록이 따라 나옵니다. 버퍼를 넘치게 하는 것, 널 포인터를 따라가는 것, 메모리를 누수시키는 것, 0으로 나누는 것입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실제로 실행되는 프로그램은 증명된 코드와 일치합니다.&lt;/strong&gt; 둘 사이에는 컴파일러가 있으므로, 또 하나의 증명이 그 출력을 검사합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;커널은 시스템의 각 부분을 서로 분리해 둘 수 있습니다.&lt;/strong&gt; 한 부분은 권한을 부여받지 않는 한 다른 부분의 데이터를 변경할 수도, 읽을 수도, 그 부분에 필요한 자원을 빼앗을 수도 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시스템은 설계된 상태 그대로 시작할 수 있습니다.&lt;/strong&gt; 시스템 기술서에 적힌 것과 정확히 같은 권한을 가지고 시작합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;모든 층이 모든 프로세서와 모든 구성에 대해 완료된 것은 아닙니다. 이 점은 중요하며, 뒤에서 다시 다루겠습니다.&lt;/p&gt;
&lt;h2 id=&quot;증명이-당연하게-여기는-것&quot;&gt;증명이 당연하게 여기는 것&lt;/h2&gt;
&lt;p&gt;증명의 범위는 그 명제의 범위와 정확히 같고, 증명은 가정 위에 서 있습니다. seL4는 자신의 가정을 적어 둡니다. 하드웨어가 그 모델이 말하는 대로 동작한다는 것, 가장 낮은 수준의 코드 수백 줄이 올바르다는 것, 커널이 시작되기 전에 실행되는 코드가 제 역할을 했다는 것입니다. 기밀성 증명은 타이밍을 다루지 않습니다.&lt;/p&gt;
&lt;p&gt;증명은 명세가 올바른 것을 요구하는지에 대해서는 아무 말도 하지 않고, 커널 위의 소프트웨어에 대해서도 아무 말도 하지 않습니다. 증명된 커널은 버그가 있는 프로그램도 충실하게 격리합니다. 버그는 여전히 거기 있습니다. 다만 다른 어떤 것에도 닿지 못할 뿐입니다.&lt;/p&gt;
&lt;p&gt;이것은 증명의 약점이 아닙니다. 증명을 가질 만한 가치가 여기에 있습니다. 증명은 무엇을 다루는지 정확히 말하므로, 무엇이 남는지도 정확히 알 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;nowayos가-서-있는-자리&quot;&gt;NoWayOS가 서 있는 자리&lt;/h2&gt;
&lt;p&gt;있는 그대로 말씀드리겠습니다. NoWayOS는 seL4 위에서 실행되지만, 현재 seL4의 완료된 증명 범위 안에 있는 NoWayOS 이미지는 없습니다. NoWayOS는 seL4의 혼합 임계성 구성을 사용하며, 저희 프로세서에 대한 그 증명은 진행 중입니다. 그리고 seL4의 증명은 NoWayOS 자체의 코드를 다룬 적이 없습니다. 그래서 저희는 NoWayOS를 “정형 검증된” 운영체제라고 부르지 않으며, 앞으로도 그렇게 부르지 않겠습니다.&lt;/p&gt;
&lt;p&gt;모든 이미지는 자신이 어디에 서 있는지 밝힙니다. 이미지 옆의 파일 하나가 커널의 구성을 seL4가 증명한 구성과 나란히, 옵션 하나하나 기록합니다. &lt;a href=&quot;/ko/security#what-sel4s-proofs-cover-and-what-they-dont&quot;&gt;보안&lt;/a&gt; 페이지에서 실제 파일을 보실 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;저희가-직접-만든-더-작은-증명&quot;&gt;저희가 직접 만든 더 작은 증명&lt;/h2&gt;
&lt;p&gt;NoWayOS의 코드는 다른 방법으로 보증을 얻습니다. Rust, 격리, 리뷰, 테스트, 그리고 더 소박한 종류의 증명입니다.&lt;/p&gt;
&lt;p&gt;시스템의 부분들 사이를 오가는 메시지의 디코더에는 모두 &lt;strong&gt;유계 증명&lt;/strong&gt;이 있습니다. Kani라는 모델 검사기로 만든 것입니다. 유계 증명은 명시된 크기까지의 모든 입력을 다룹니다. 여기서는 디코더가 받아들이는 가장 긴 레코드까지입니다. 그 한도 안에서는 진짜 증명입니다. 어떤 입력도 디코더에 패닉, 오버플로, 범위 밖 읽기를 일으키지 못합니다. 한도 밖에 대해서는 아무 말도 하지 않습니다. 그래서 한도를 있을 수 있는 가장 긴 입력에 맞추었습니다.&lt;/p&gt;
&lt;p&gt;그런 다음 저희는 디코더를 일부러 망가뜨려, 증명이 그것을 알아차리는지 확인합니다. 실패할 수 없는 증명은 &lt;a href=&quot;/ko/journal/we-attack-our-own-build&quot;&gt;실패할 수 없는 테스트&lt;/a&gt;보다 나을 것이 없습니다.&lt;/p&gt;
&lt;h2 id=&quot;있는-그대로의-크기&quot;&gt;있는 그대로의 크기&lt;/h2&gt;
&lt;p&gt;증명은 어떤 것도 “해킹 불가능”하게 만들지 않습니다. 증명은 하나의 명제를, 모든 경우에, 읽어 볼 수 있는 가정 아래에서 참으로 만듭니다. 명제와 가정을 알면, 무엇을 가졌는지 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;그래서 NoWayOS는 그런 증명을 갖춘 커널 위에 만들어졌고, 그 증명이 어디까지 닿는지를 이미지마다 알려 드립니다.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>NoWayOS 장치에 셸이 없는 이유</title>
    <link href="https://www.nowayos.com/ko/journal/why-a-nowayos-device-has-no-shell"/>
    <id>https://www.nowayos.com/ko/journal/why-a-nowayos-device-has-no-shell</id>
    <published>2026-11-13T00:00:00Z</published>
    <updated>2026-11-13T00:00:00Z</updated>
    <summary>대부분의 전용 장치는 범용 컴퓨터 위에 한 가지 일을 올려 두고, 그 아래에 나머지를 모두 그대로 남겨 둡니다. 저희는 다른 길을 택했습니다. 각 장치를 그 일에 필요한 것만으로 만들고, 나머지는 넣지 않는 길입니다.</summary>
    <content type="html">&lt;p&gt;전용 장치에 대한 공격은 대부분 그 장치가 하는 일을 노리지 않습니다. 장치가 돌아가는 컴퓨터의 나머지 부분을 노립니다. 유지보수용으로 남겨 둔 셸, 아무도 끄지 않은 원격 접속 서비스, 애플리케이션 뒤의 브라우저, 충돌 한 번이면 드러나는 데스크톱입니다.&lt;/p&gt;
&lt;p&gt;이 “컴퓨터의 나머지 부분”은 어디에나 있습니다. 정수장에서 측정값을 내보내는 게이트웨이, 전력망 제어실의 단말기, 병원이 의지하는 장치, 기계 옆면의 패널, 역 대합실의 화면. 이들 중 다수는 범용 운영체제를 실행하며, 그 위에 한 가지 일이 있고, 아래에는 나머지가 설정으로 꺼진 채 모두 남아 있습니다. 키오스크 모드는 그 가장 단순한 형태입니다. 침해는 언제나 누군가 놓친 설정 하나를 찾아내는 일입니다.&lt;/p&gt;
&lt;h2 id=&quot;끄는-대신-넣지-않습니다&quot;&gt;끄는 대신, 넣지 않습니다&lt;/h2&gt;
&lt;p&gt;NoWayOS는 반대쪽에서 출발합니다. NoWayOS 이미지에는 장치의 애플리케이션, 그 애플리케이션이 쓰는 드라이버, 그리고 seL4 마이크로커널이 들어 있습니다. 목록은 그것이 전부입니다.&lt;/p&gt;
&lt;p&gt;들어갈 셸이 없습니다. 처음부터 넣지 않았기 때문입니다. 비밀번호를 추측해 볼 원격 로그인도 없습니다. 빠져나갈 데스크톱도 없습니다. 악성 페이지를 기다리는 브라우저 엔진도 없습니다. 없는 소프트웨어의 설정은 잘못 지정할 수 없습니다.&lt;/p&gt;
&lt;p&gt;여기까지는 모두 운영체제에 관한 이야기입니다. 그 위에서 실행되는 애플리케이션은 다릅니다. 애플리케이션은 맡은 일에 필요하다면 사용자를 로그인시킬 수 있고, 다른 시스템에 로그인할 수도 있습니다. 다만 그 아래에 누군가 로그인할 수 있는 운영체제가 없을 뿐입니다.&lt;/p&gt;
&lt;p&gt;저희는 이것을 &lt;strong&gt;Single Purpose OS&lt;/strong&gt;라고 부릅니다. 다른 할 일이 없는 컴퓨터.&lt;/p&gt;
&lt;h2 id=&quot;그리고-있는-것은-봉인되어-있습니다&quot;&gt;그리고 있는 것은 봉인되어 있습니다&lt;/h2&gt;
&lt;p&gt;넣지 않는 것은 절반입니다. 남은 각 부분(네트워크, 화면, 입력, 애플리케이션)은 저마다의 구획, seL4 용어로 &lt;em&gt;보호 도메인&lt;/em&gt; 안에서 실행되며, 부여받은 것에만 닿습니다. 네트워크 드라이버는 패킷을 옮깁니다. 디스플레이 드라이버는 화면을 그립니다. 애플리케이션은 고정 크기 메시지로 각각과 통신합니다.&lt;/p&gt;
&lt;p&gt;모든 권한 부여는 한 줄에 사실 하나씩 파일에 기록되며, 시스템과 파일이 일치하지 않으면 빌드가 실패합니다. 한 부분의 폴트가 그 부분 안에 머물도록 만들어져 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;그런데-셸-없이-어떻게-고칩니까&quot;&gt;“그런데 셸 없이 어떻게 고칩니까?”&lt;/h2&gt;
&lt;p&gt;엔지니어들이 가장 먼저 묻는 질문이고, 당연한 질문입니다. NoWayOS 장치의 운영체제에는 로그인하지 않습니다. 계정이 없어서 로그인할 사용자가 없기 때문입니다. 새 이미지를 빌드해 이전 이미지를 교체합니다. 지금은 이미지를 빌드해 보드에 올린다는 뜻입니다. 장치가 검사하고 안전하게 되돌아갈 수 있는 서명된 업데이트는 설계되어 있으며, 구현을 앞두고 있습니다.&lt;/p&gt;
&lt;p&gt;그 대가로 얻는 것은 자신의 한 가지 일로 곧장 시작하는 장치, 패치할 것도 공격할 것도 훨씬 적은 장치입니다. 한 나라가 의지하는 시스템이라면, 이 맞바꿈이 바로 목적입니다.&lt;/p&gt;
&lt;h2 id=&quot;직접-확인해-보십시오&quot;&gt;직접 확인해 보십시오&lt;/h2&gt;
&lt;p&gt;실제 NoWayOS 이미지 하나의 증거, 곧 권한 부여 파일, 소프트웨어 자재 명세서, seL4 구성 기록은 저희 &lt;a href=&quot;/ko/security#read-one-images-evidence&quot;&gt;보안 페이지&lt;/a&gt;에 있습니다. 가입도 스크립트도 없습니다. 파일만 있습니다.&lt;/p&gt;
</content>
  </entry>
</feed>
