C 컴파일러를 처음부터 컴파일한 다음 Unix/Linux를 처음부터 컴파일하는 방법

C 컴파일러를 처음부터 컴파일한 다음 Unix/Linux를 처음부터 컴파일하는 방법

제가 미국/영국 이외의 대규모 서비스 조직에서 근무한다고 가정해 보겠습니다. 우리는 UNIX 및 Linux 서버를 광범위하게 사용합니다.

끝까지 읽어라이 기사C 컴파일러에 백도어를 삽입하는 것은 쉽고 해당 컴파일러를 사용하여 컴파일된 모든 코드에도 백도어가 포함된다는 점을 언급했습니다. 이제 모든 암호화 방법, 하드웨어 및 소프트웨어의 백도어/약점을 승인하는 NSA/GCHQ에 대한 최근 유출에 비추어 볼 때 컴파일러는 이제 중요한 실패 지점입니다. 모든 표준 UNIX/Linix 배포판이 손상될 수 있습니다. 우리는 우리의 시스템, 데이터 및 고객 데이터가 불량 정부에 의해 침해되는 것을 허용할 수 없습니다.

이 정보를 사용하여 처음부터 신뢰할 수 있는 컴파일러를 구축하고 보안 기반을 확보하여 해당 컴파일러를 사용하여 소스에서 운영 체제와 애플리케이션을 구축할 수 있습니다.

질문

소스에서 컴파일러를 구축하고(겉으로는 닭과 달걀이 필요한 상황) 신뢰할 수 있는 Unix/Linux 배포판을 처음부터 컴파일하는 올바른(그리고 안전한) 방법은 무엇입니까?

나 또는 다른 사람들이 소스 코드의 보안 결함을 읽고 이해할 수 있는 능력이 있다고 가정할 수 있으므로 컴파일하기 전에 먼저 소스 코드를 검토하게 됩니다. 내가 정말로 원하는 것은 커널, 운영 체제 및 애플리케이션의 다른 부분을 컴파일하는 데 사용할 수 있는 이 컴파일러를 처음부터 안전하게 생성하기 위한 작업 가이드입니다.

스택에서 실행되는 운영 체제나 애플리케이션에 대한 확신을 가지려면 보안 스택이 기초 수준에서 시작되어야 합니다. 예, 컴파일러가 빌드될 때 일부 마이크로코드를 컴파일러에 삽입할 수 있는 하드웨어 백도어가 있을 수 있다는 것을 알고 있습니다. 미국이 아닌 곳에서 설계한 칩을 사용하는 것 외에는 현재로서는 할 수 있는 일이 없습니다. 먼저 이 레이어를 정렬하고 백도어를 삽입하기 전에 오래된 컴퓨터에서 이를 구축할 수 있다고 가정하겠습니다.

브루스 슈넬(Bruce Schnell)이 말했듯이:"저는 엔지니어들에게 이렇게 말합니다. 우리는 인터넷을 만들었고 우리 중 일부는 이를 방해하는 데 도움을 주었습니다. 이제 자유를 사랑하는 우리는 인터넷을 고쳐야 합니다."

추가 링크:

답변1

AFAIK는 안전을 완전히 보장하는 유일한 방법은 어셈블리 언어(또는직접 디스크 수정). 그래야만 컴파일러가 백도어를 삽입하지 않는다는 것을 확인할 수 있습니다. 이는 실제로 컴파일러를 완전히 제거하기 때문에 효과적입니다.

여기에서 컴파일러를 사용하여 처음부터 GNU 툴체인 등을 부트스트랩할 수 있습니다. 그런 다음 사용자 정의 도구 체인을 사용하여 컴파일할 수 있습니다.처음부터 리눅스체계.

작업을 더 쉽게 하기 위해 C(또는 다른 언어)로 작성된 두 번째 중간 컴파일러를 가질 수 있습니다. 따라서 컴파일러 A를 어셈블리로 작성한 다음 해당 컴파일러를 C/C++/Python/Brainfuck/무엇이든 다시 작성하여 컴파일러 B를 얻을 수 있으며, 컴파일러 A를 사용하여 컴파일합니다. 그런 다음 컴파일러 B를 사용하여 gcc와 친구들을 컴파일합니다.

답변2

한 가지 가능한 접근 방식은 뿌리로 돌아가는 것이지만 실제로는 시간이 오래 걸립니다. GNU 개발은 1984년에 시작되었으며, Minix의 원본 버전(초기 Linux 개발 중 부팅 목적으로 사용됨)은 1987년에 출시되었습니다.

전체 답변은 "[귀하] 또는 다른 사람들이 보안 결함에 대한 소스 코드를 읽고 이해할 수 있는 능력이 있으므로 컴파일하기 전에 먼저 소스 코드를 검토할 것입니다"라는 전제에 기반하고 있으며 그러한 분석 결과를 신뢰할 수 있습니다. . 이것이 없으면 이 답변은 아마도 아무런 유익도 없이 많은 시간을 소비하게 될 것이기 때문에 아마도 쓸모없는 것보다 더 나쁠 것입니다.

소스 코드가 포함된 원본 Minix 책의 사본을 찾을 수 있으면 책에서 직접 입력할 수 있습니다. 이를 컴파일한 다음 다양한 시스템에서 다양한 디컴파일러를 사용하여 컴파일러가 예상되는 기계어 바이너리 출력을 생성하는지 확인합니다. (코드가 12,000줄밖에 안되는데 아마 C언어라서 시간이 더 걸리긴 하지만 그래도 한계 안에 있습니다.이유이런 프로젝트에 대해 진지하게 생각한다면. ) 자신만의 디스어셈블러를 작성할 수도 있습니다. 이는 그다지 어렵지 않습니다.

손에 넣을 수 있는 가장 오래된 버전의 GNU 유틸리티를 구하고(이러한 버전은 코드가 적고 외부 라이브러리에 대한 의존도가 낮기 때문입니다), 코드를 찾아보고 Minix용으로 빌드합니다(그러나 약간의 작업이 필요할 수 있습니다. 수행할 수 있는 작업) 확실히 피해야 할 작업은 소스 코드를 조정하는 것입니다. 이렇게 하면 나중에 패치를 추가하면 오류가 발생하기 쉽습니다. GNU 도구와 유사한 디스어셈블리 검증 주기를 거치게 됩니다. 이 시점에서는 OS와 툴체인을 신뢰하므로 패치 세트에 있는 소스 코드만 보면 되지만(패치 세트에 없는 것은 이미 신뢰된 것입니다), 도구에 비해 도구는 여전히 매우 원시적이고 조잡합니다. 당신은 오늘날까지 사용합니다. 예를 들어, 시스템 도구의 가장 기본적인 기능이 제대로 작동할 것이라고 기대하지 마십시오. 이제 모든 것을 Minix로 전송 및 마이그레이션하고 한 번에 한 버전씩 패치 적용을 시작하여 각 버전 사이에 영향을 받는 모든 것을 다시 빌드하고 다음에 새 버전을 사용하십시오.XKCD를 많이 읽어보세요.

어느 시점에는 1990년대 초 Linux가 해커들에게 인기를 끌기 시작했을 때와 마찬가지로 이전 버전의 Linux 커널을 컴파일하고 부팅할 수 있는 시스템을 갖게 될 것입니다. 이 시점에서 Linux로 마이그레이션하는 것이 좋습니다(Linux용 시스템 라이브러리 및 도구 체인 재구축, Linux 커널 빌드, Linux로 부팅 및 Linux에서 Linux 커널 및 GNU 도구 체인 재구축, 결국 시스템이 이제 자가 치유됨을 입증함). , 그러나 이는 주로 귀하에게 달려 있습니다. 최신 버전에 도달할 때까지 지속적으로 패치를 확인하고 커널, 라이브러리 및 기본 GNU 도구를 패치하고 다시 빌드하세요.

이제 최신 소프트웨어를 구축하는 데 사용할 수 있는 신뢰할 수 있는 기본 운영 체제와 컴파일러가 생겼습니다. 그 시점에서 예를 들어 다음을 수행할 수 있습니다.처음부터 리눅스성능을 발휘하는 시스템 구축 가이드효과가있다일.

"컴파일러" 시스템은 어떤 방식으로든(네트워크 호스트의 가상 머신 포함) 네트워크에 연결되어서는 안 됩니다. 네트워크 지원 구성 요소(커널 포함)에 침투할 위험이 있습니다. 걱정된다면톰슨 컴파일러 공격, 모든 VM 호스트도 손상될 수 있음을 예상해야 합니다. sneakersnet을 사용하여 컴파일 중인 물리적 호스트에서 소스 코드와 바이너리를 얻으세요. 적어도 USB 대용량 저장 장치 지원이 구현될 때까지는 시스템에 파일을 가져오고 내보내는 데 문제가 있을 것으로 예상됩니다. 정말 편집증이 있는 경우 소스 코드 목록을 인쇄하고 수동으로 입력하십시오(프린터 드라이버와 프린터에 유사한 코드가 없기를 바랍니다).그들을) 또는 한 컴퓨터 모니터에서 코드를 읽고 물리적으로 옆에 있지만 연결되지 않은 다른 컴퓨터에 입력합니다.

예, 필요합니다많은시간. 그러나 이 접근 방식의 장점은 각 단계가 점진적이라는 것입니다. 즉, 여러 버전에 걸쳐 점차적으로 도입되지 않는 한 모든 악의적인 동작은 탈출하기 어렵습니다. 이는 각 단계의 변경 사항이 상대적으로 적기 때문에 더 쉽습니다. 확인하다. 패치 세트를 변경 로그와 비교하여 소스 코드의 각 변경 사항에 해당하는 변경 로그 항목을 정확하게 확인할 수 있습니다. 다시 말하지만, 이는 그러한 변경 사항이 아직 코드베이스에 적용되지 않았는지 확인할 수 있는 능력(아마도 신뢰하는 사람을 통해)이 있다고 가정합니다.펌웨어를 제외하고 순수한 소프트웨어 접근 방식만큼 신뢰할 수 있는 시스템에 가까워져야 합니다.

답변3

신뢰할 수 있는 컴파일러가 필요하다면 다음과 같은 학문적 저작물을 살펴보세요.계산기 라이센스프로젝트. 이는 INRIA(프랑스 IT 공공 연구소)에서 구축한 컴파일러이며 "인증"을 받도록 설계되었습니다. 즉, 코드와 의미상 정확히 동일한 실행 파일을 생성하도록 설계되었습니다(물론 수학적으로 입증되었습니다).

답변4

시작점으로 자신만의 컴파일러를 수동으로 생성하는 것이 가장 안전하지만, 또 다른 옵션은 이러한 익스플로잇이 악용되기 전에 생성되었다고 생각되는 5년(또는 10년) 된 설치 CD에서 시스템을 설치하는 것입니다. 그런 다음 이는 새로운 감사 소스를 컴파일하기 위한 기초로 사용됩니다.

관련 정보