관리되는 코드를 실행하는 최소한의 커널을 갖는 잠재적 인 함정은 무엇입니까?


14

관리 코드 인터프리터 / 런타임으로 작동하는 매우 작은 기본 하위 커널과 비원시 기계 언어 (Java 바이트 코드, CIL 등)로 컴파일 된 더 큰 상위 커널을 기반으로 운영 체제를 구축하려고한다고 가정합니다. 유사한 운영 체제의 예로는 SingularityCosmos가 있습니다.

순수 네이티브 솔루션과 달리 이러한 종류의 인프라로 OS를 작성하는 데 어떤 함정과 개발 과제가 있습니까?

답변:


8

언어에 따라 많은 개발 과제가있을 수 있습니다.

  1. 포인터 : 언어에 포인터가 없으면 비교적 쉬운 작업을 수행하는 것이 어려울 것입니다. 예를 들어, 포인터를 사용하여 화면에 인쇄하기 위해 VGA 메모리에 쓸 수 있습니다. 그러나 관리되는 언어에서는 동일한 작업을 수행하려면 C / C ++의 "플러그"가 필요합니다.

  2. 어셈블리 : OS에는 항상 일부 어셈블리가 필요합니다. C #, Java 등과 같은 언어는 C / C ++와 달리 잘 작동하지 않습니다. C 또는 C ++에서는 많은 작업에 매우 유용한 인라인 어셈블리를 가질 수도 있습니다. 이것이 필요한 많은 경우가 있습니다 (x86의 예) : GDT로드, IDT로드, 페이징 활성화, IRQ 설정 등.

  3. 제어 : Cosmos와 같은 것을 사용하는 경우 전체 제어 권한이 없습니다. Cosmos는 마이크로 커널이며 본질적으로 "커널"을 "부트 스트랩"합니다. 그러나 시간이 오래 걸리는 코스모스와 같은 것을 처음부터 구현할 수 있습니다.

  4. 오버 헤드 : 관리되는 언어의 경우 C 또는 C ++에 비해 많은 오버 헤드가 있습니다. Cosmos와 같은 것은 C # hello world 커널을 실행하기 전에 많은 것을 구현해야합니다. C에서는 실제 설정이 필요하지 않습니다. C ++에는 C ++ 기능 중 일부를 사용하기 위해 구현해야 할 것이 몇 가지 있습니다.

  5. 구조 : C / C ++에는 많은 관리되는 언어에없는 구조체가 있으므로 구조체와 같은 방법을 구현해야합니다. 예를 들어, C / C ++에서 IDT (인터럽트 디스크립터 테이블)를로드하려는 경우 압축 된 속성으로 구조체를 작성하고 x86 ASM 명령어 lidt를 사용하여로드 할 수 있습니다. 관리되는 언어에서는 수행하기가 훨씬 어렵습니다 ...

관리되는 언어는 구문별로 쉽지만 많은 OS 관련 사항이 적합하지 않은 경우가 많습니다. 그렇다고해서 사용할 수는 없지만 C / C ++와 같은 것이 권장되는 경우가 많습니다.


이 답변은 매우 약합니다. 포인터 없이는 할 수없는“상대적으로 쉬운 작업”은 무엇입니까 (작은 기초 제외)? 조립이 필요한 부품은 무엇입니까? 어떤 통제력이 부족합니까? 간접비에 대한 진술의 근거는 무엇입니까? 왜 관리되는 언어로 구조를 가질 수 없습니까?
Gilles 'SO- 악마 그만해'

1. 관리되는 언어가 VGA 메모리에 액세스하는 기능을 제공하지 않는 이유는 없습니다. 매핑 / 언 매핑 만 프리미티브 (메모리 관리 프리미티브)로 제공되어야합니다. 2. 일부 작업 전환 (예 : 레지스터 저장)은 일반적으로 어셈블리 코드로 수행되어야하지만 매우 현지화되어 있기 때문에 관리 언어로 OS의 99 %를 사용하는 것에 대한 논쟁이 아닙니다. MMU 조작은 메모리 관리 기본 요소입니다. 4. C도 설정해야합니다 (스택 및 힙 설정). 관리되는 언어에는 약간의 설정이 더 필요하지만 질적 인 차이는 없습니다.
Gilles 'SO- 악마 그만'

@Gilles, 문제는 관리되는 언어를 사용하는 데있어 개발상의 문제입니다. 이러한 문제는 개발상의 문제이지만 이러한 문제를 여전히 극복 할 수 있습니다.
mmk

5

( 경쟁하는 마이크로 커널 기술을 연구하는 연구원에 의해 ) 관리 코드를 통해 확장 가능한 시스템의 보안을 평가하는 방법에 대해서는 알려진 바가 거의 없다고 들었습니다 .

문제는 보안 허점을 유발할 수있는 버그 종류가 보안 연구원과는 매우 다르다는 것입니다. 전통적인 마이크로 커널에서는 커널의 모든 드라이버와 다른 서브 파트가 서로 다른 주소 공간에서 실행되어 서로 분리되어 있습니다. 유형 검사 관리 코드를 통해 격리가 구현되는 마이크로 커널에서는 하위 서비스를 사용해야 할 때마다 주소 공간을 전환 할 때 발생하는 엄청난 오버 헤드를 피할 수 있지만 이제 격리 메커니즘을 평가하는 것이 더 어렵다는 단점이 있습니다.

관리 언어로 작성된 커널의 특정 부분 (예 : 장치 드라이버)은 유형 검사기가 드라이버가 안전 하고 유형 검사기에 버그가없는 경우에만 안전합니다 . 따라서 유형 검사기는 커널 코어의 일부입니다. 실제로 타입 체커는 기존의 마이크로 커널 코어보다 상당히 크고 복잡합니다. 이는 공격 표면 이 잠재적으로 더 크다는 것을 의미합니다 .

기존의 마이크로 커널 격리 기술 또는 관리 코드 기반 격리 기술이 실제로 어느 정도 신뢰할 수 있는지 모르겠습니다. 여기에는 부트 스트랩 문제가 있습니다. 관리 코드 격리 기술이 널리 사용될 때까지 얼마나 안전하지 않은지 알 수 없습니다. 그러나 얼마나 안전하지 않은지 알지 못하면 보안이 중요한 상황에 배치하기가 어렵습니다.


훌륭한 지적입니다.
Adam Maras

나는이 주장들이 매우 이상하다고 생각한다. (나는 공식적인 방법으로 내 배경에 편견이있을 수 있지만 이것이 내 의견의 유일한 근거는 아닙니다.) 유형 검사기는 마이크로 커널과 MMU에 비해 ​​그렇게 복잡하지 않습니다. 예를 들어, Coq의 마이크로 커널은 약 14kLoC의 OCaml로 마이크로 커널보다 크지 만 그다지 크지 않으며 대부분의 커널 (C 또는 어셈블러 없음)보다 오류가 적은 언어로 작성되었습니다. 타입 체커는 경쟁 조건에 취약하지 않으며, 특히 미묘한 버그 클래스입니다.
Gilles 'SO- 악마 그만해'

관리 코드는 특정 종류의 버그를 처리 할 수있는 더 나은 기회를 제공합니다. 예를 들어, 정보 흐름 분석은 사이드 채널이 없음을 증명할 수 있습니다 (많은 작업을 수행 할 가능성이 있으며 어느 정도까지 수행했는지는 모르지만 원칙적으로는 가능합니다). 하드웨어 격리는 테스트 만 가능합니다. 당신이 생각한 사이드 채널.
Gilles 'SO- 악마 그만해'

실제로는 격리를 제공하는 여러 가상 머신이 EAL5 이상에서 인증되었습니다. 다음은 신용 카드와 같은 스마트 카드에 사용되기 때문에 유럽인이라면 지갑에 넣을 수있는 두 가지 예입니다. MULTOS , Java Card open platform . 보안 평가 커뮤니티에서 MMU 격리가 EAL2를 넘어 설 수 있다는 많은 의문을 들었습니다.
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.