Как скомпилировать компилятор C с нуля, затем скомпилируйте Unix/Linux с нуля

Возможный подход, для сокращения строки от главы, пока это не соответствует:

#!/bin/sh
string="TMP_ABQ_SEQ_NUM"
while ! grep "$string" dictionary.txt; do 
  # remove the shortest leading string ending with "_"
  string="${string#*_}"
done
64
20.09.2013, 11:36
4 ответа

AFAIK единственный способ быть абсолютно уверенным в безопасности должен был бы записать компилятор в ассемблере (или изменение диска непосредственно самостоятельно). Только затем можете Вы удостоверяться, что Ваш компилятор не вставляет бэкдор - это работает, потому что Вы на самом деле устраняете компилятор полностью.

Оттуда, можно использовать Ваш с нуля компилятор для начальной загрузки, например, набор инструментальных средств GNU. Затем Вы могли использовать свой пользовательский набор инструментальных средств для компиляции Linux С нуля система.

Обратите внимание, что для создания вещей легче на себе у Вас мог быть второй посреднический компилятор, записанный в C (или безотносительно другого языка). Таким образом, Вы записали бы компилятор в блоке, затем переписать тот компилятор в C/C ++/Python/Brainfuck/whatever для получения компилятора B, который Вы скомпилировали бы компилятор использования A. Затем Вы использовали бы компилятор B для компиляции gcc и друзей.

30
27.01.2020, 19:32
  • 1
    Несмотря на это, это все еще только защищает от злонамеренного компилятора. Все еще необходимо доверять системе, на которой выполняется компилятор. Никакое программное обеспечение не существует в изоляции. –  a CVn 09.09.2013, 11:04
  • 2
    Что-либо автономное по сути опасно. Вы эффективно предлагаете компилятор набора инструментальных средств (хотя странный), что означает, что он может, вероятно, быть изменен точно способом, которым Вы стараетесь избегать. Еще лучше это могло быть изменено в пути через MitM. –  strugee 09.09.2013, 12:18
  • 3
    Вы парни должны понять, что этот ответ появляется от 15-летнего. Продолжайте идти strugee! –  mtahmed 28.05.2014, 21:24
  • 4
    Не нужно забывать также писать редактор кода с нуля - кто знает, компилируете ли Ваш предварительно скомпилированный <код> энергия </код> или <код> энергия </код> Вы со своим хорошим компилятором из источника, Вы контролировали только использование, заразили <кодируют> энергию </, код> защищен? –  Hagen von Eitzen 09.07.2014, 18:27
  • 5
    , Никогда не забывают, это, если Вы лично не записали что первый машинный код (не блок. фактический машинный код), и Вы - эксперт в распознавании закулисных дыр в системе безопасности, и читаете и проверили каждую строку кода, Вы компилируете … или по крайней мере знаете человека, который сделал это лично и доверяет ему, чтобы сделать этот …. ни одно из этого не поможет вообще. Вот почему пробуя к Ножному стартеру это, разрушает самое главное. Который является: Высокая степень доверия. –  Evi1M4chine 26.01.2016, 16:02

Один возможный путь, хотя это чрезвычайно заняло бы много времени на практике, будет состоять в том, чтобы вернуться к корням. Разработка GNU началась в 1984, и исходная версия Minix (который использовался во время ранней разработки Linux для начальной загрузки целей), был выпущен в 1987.

Этот весь ответ основан на Вашей предпосылке, что" [у Вас] или других есть способность считать и понять исходный код для дефектов безопасности, таким образом, исходный код будет исследоваться сначала перед компиляцией", и что можно доверять результату такого анализа. Без этого этот ответ, вероятно, хуже, чем бесполезный, поскольку Вы будете проводить огромное количество времени для абсолютно никакого преимущества вообще.

Если можно найти копию исходной книги Minix с исходным кодом, можно ввести его из книги. Скомпилируйте его и затем используйте другой декомпилятор в другой системе, чтобы проверить, что компилятор генерирует ожидаемый двоичный выход машинного языка. (Код является только 12 000 строк, по-видимому, C, таким образом делание так является трудоемким, но все еще в причине, если Вы серьезно относитесь к такому проекту.) Вы могли даже записать свой собственный дизассемблер; это не должно быть очень трудно.

Захватите самые старые версии утилит GNU, можно возможно достать (поскольку у этого, по-видимому, есть меньше кода и меньше зависимостей к внешним библиотекам), пройдите код, создайте его для Minix (это могло бы взять некоторую работу, хотя; то, чего Вы абсолютно хотите избежать, должно внести изменения в исходный код, потому что это сделает добавляющие патчи позже очень подверженными ошибкам), и пройдите подобное, демонтируют - проверяют цикл для инструментов GNU. В той точке Вы доверяете ОС и набору инструментальных средств, таким образом, только необходимо пройти исходный код в patchset (чему-либо не в patchset уже доверяют), но инструменты все еще будут очень примитивны и сыры по сравнению с тем, к чему Вы привыкли сегодня. Не ожидайте, что что-то большее чем очень самая основная функциональность системных инструментов будут работать, например. Теперь передайте все и мигрируйте на Minix и начните применять патчи, одна версия за один раз, восстановив все затронутое между каждой версией и использованием новой версии в следующий раз вокруг. Считайте много XKCD.

В какой-то момент у Вас будет система, которая может скомпилировать и загрузить раннюю версию ядра Linux, во многом как он был сделан в начале 1990-х, поскольку Linux начал наращивать обороты среди хакеров. Я предложил бы мигрировать на Linux в той точке (восстановите системные библиотеки и набор инструментальных средств против Linux, создайте ядро Linux, начальную загрузку в Linux и возможно восстановите ядро Linux и набор инструментальных средств GNU в рамках Linux; последнее доказывает, что система теперь саморазмещает), но это в основном ваше дело. Продолжайте проверять патчи, исправляя ядро, библиотеки и основные инструменты GNU, и восстанавливая, пока Вы не доберетесь до современных версий.

Именно тогда у Вас есть доверяемая основная ОС и компилятор, который может использоваться для создания современного программного обеспечения. К тому времени можно следовать, например, Linux С нуля ведет для создания системы, способной к выполнению полезных задач.

Ни в каком смысле может система "компилятора" когда-либо быть подключенным к сети всегда (включая как VM на сетевом узле); Вы рискнули бы проникновением через любой способный к сети компонент включая ядро. Если бы Вы волнуетесь по поводу нападения компилятора Thompson, необходимо было бы ожидать, что любой хост VM также может быть поставлен под угрозу. Используйте sneakernet для получения исходного кода к и двоичных файлов от физического хоста, на котором Вы компилируете вещи. Ожидайте проблему, надевающую файлы и от системы, по крайней мере, прежде чем Вы перейдете к сути дела, где поддержка массового хранения USB была реализована. Если Вы действительно параноики, печатаете листинги исходного кода и вводите их вручную (и надеются, что драйвер принтера и принтер не имеют подобного кода в них), или прочитайте код на одном компьютерном мониторе и введите его в другой компьютер физически рядом с, но не подключенные к нему.

Да, это займет много времени. Но преимущество для этого подхода состоит в том, что каждый шаг является возрастающим, означая, что чему-либо злонамеренному было бы намного более трудно проскользнуть через, если он очень постепенно не представляется в течение многих версий; это, потому что набор изменений на каждом шаге является сравнительно маленьким и таким образом намного легче просмотреть. Сравните patchset с журналом изменений и удостоверьтесь, что можно определить точно, какая запись журнала изменений соответствует каждому изменению в исходном коде. Снова, это действительно предполагает, что у Вас есть способность (возможно через кого-то, кому Вы доверяете) проверить, что такие изменения не были стащены в кодовую базу, но это должно получить Вас о как близко к достоверной системе, как подход кроме встроенного микропрограммного обеспечения только для программного обеспечения может.

23
27.01.2020, 19:32
  • 1
    Dissassemble-проверить метод является очень дефектным, поскольку он все еще делает огромное предположение, что машина проверки полностью защищена. Если Вы не создали ту машину и ее программное обеспечение с нуля, или знайте человека, который сделал лично и доверяет ей, это не собирается происходить. Таким образом, это все еще небезопасно.Прошу прощения. … … кроме того, в этих вопросах “как близко к …” все еще означает “небезопасный”, поскольку он только требует, чтобы одно единственное ненадежное место разрушило самое главное. –  Evi1M4chine 26.01.2016, 16:07

При необходимости в доверяемом компиляторе Вы могли бы получить взгляд на научную работу, как compcert проект. Это - компилятор, созданный INRIA (французская лаборатория общественности IT) разработанный, чтобы быть ''сертифицированным'', т.е. произвести исполняемый файл, семантически совершенно эквивалентный коду (и конечно, это было математически доказано).

9
27.01.2020, 19:32
  • 1
    Всем нужен доверяемый компилятор. Как математика работает, что они могут произвести "доверяемый" компилятор? –  David J 09.09.2013, 12:15
  • 2
    @DavidJ, скорее всего. Создайте некоторую крошечную часть, которую можно полностью проверить и оказаться корректными, затем использовать его в качестве основы для создания более сложных компиляторов. –  a CVn 09.09.2013, 12:31
  • 3
    ", ""Что устанавливает CompCert C кроме любого другого производственного компилятора, то, что он официально проверяется, с помощью помогших с машиной математических доказательств, чтобы быть освобожденным от проблем miscompilation """. Компиляция compcert.inria.fr/compcert-C.html не является столь эмпирической, как она раньше была. –  lgeorget 09.09.2013, 13:27
  • 4
    @MichaelKjörling, который, вероятно, не принимает во внимание, что ядро может быть поставлено под угрозу для включения бэкдора в источник компилятора, когда считано компилятором –  ratchet freak 09.09.2013, 17:09
  • 5
    я также нашел эту ссылку, которая могла работать также. –  David J 21.09.2013, 04:33

Вручную создавая Ваш собственный компилятор, поскольку начальная точка была бы самой безопасной, другая опция состоит в том, чтобы установить систему от 5 (или 10) установка года CD, которому Вы доверяете, был создан, прежде чем это использование существовало. Затем используйте это в качестве основы для компиляции нового контролируемого источника от.

2
27.01.2020, 19:32
  • 1
    Нападение было публично известно с 1984. По-видимому, Thompson не был первым для размышления о возможности. Возвращение того далеко означает, что большинство вещей, которые мы считаем само собой разумеющимся сегодня, не было вокруг; рассмотрите, какие компьютеры были способны к выполнению 20 лет назад и сравнивают его со своим текущим состоянием. Даже исходная система начальной загрузки Linux, Minix не был выпущен до '87, и разработка GNU, началась в '84. Таким образом, в то время как в теории это может ответить на вопрос, на практике это в основном бесполезно как ответ. –  a CVn 09.09.2013, 11:34
  • 2
    Самый ранний компьютер, который я мог потенциально достать, будет 286. Я должен буду видеть, есть ли у моей бабушки и дедушки все еще он. Начальная загрузка –  David J 09.09.2013, 12:18
  • 3
    для того, чтобы на самом деле рассмотреть это :-). @DavidJ –  11684 09.09.2013, 21:58
  • 4
    @MichaelKjörling:Не совсем; так как это только делает Вашу цепочку из начальной загрузки дольше. Но возможно не пока запись Вашего собственного компилятора с нуля на машинном языке. –  Evi1M4chine 26.01.2016, 16:14

Теги

Похожие вопросы