Странная машина

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

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

Теория

Странные машины возникают вследствие сложности модели вычислений и внешних воздействий, выходящих за рамки предусмотренной модели. Например, странная машина может возникнуть из-за того, что входной формат является Тьюринг-полным, наличия уязвимостей повреждения памяти или потому, что аппаратное обеспечение способно вести себя непредсказуемо с точки зрения модели вычислений[3].

С теоретической точки зрения появление странных машин становится понятным, если рассматривать программное обеспечение как способ ограничить количество достижимых состояний и переходов между ними на компьютере: универсальный ЦП с помощью программного обеспечения сужается до имитации конечного автомата (пусть и с очень большим пространством состояний). Многие состояния и переходы, которые теоретически доступны для процессора, исключаются, особенно те, что нарушают требования безопасности программного обеспечения. Если система каким-либо образом переходит в состояние, «не имеющее смысла» с точки зрения задуманного конечного автомата (из-за повреждения памяти, отказа оборудования или ошибок программирования), программное обеспечение начнёт преобразовывать это повреждённое состояние в другие сбойные состояния, по мере поступления новых входных данных. Возникает новое вычислительное устройство: странная машина, которая может достигнуть таких состояний процессора, какие первоначально не предполагались разработчиком, и действует она под контролем входных данных злоумышленника.

Применение

undefined

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

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

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

Поведение странной машины наблюдается даже в аппаратном обеспечении. Например, показано, что вычисления можно реализовать, используя только инструкции MOV на архитектуре x86[5].

Защита

Основные меры противодействия проблемам, вызываемым функциональностью странной машины, включают в себя валидацию входных данных в программном обеспечении и предотвращение проблем, связанных с платформой, на которой выполняется программа (например, ошибок памяти). Валидация входных данных призвана ограничить диапазон и форму неожиданных входных данных, например, с помощью белых списков допустимых значений, чтобы программа не переходила во внутреннее некорректное состояние при обработке данных. Не менее важно применение безопасных практик программирования — таких, как защита от переполнения буфера, — в целях снижения вероятности того, что входные данные будут интерпретированы аппаратурой неожиданным образом.

Примечания

  1. Bratus, Sergey; Locasto, Michael E.; Patterson, Meredith L.; Sassaman, Len; Shubina, Anna (декабрь 2011). “Exploit Programming — From Buffer Overflows to "Weird Machines" and Theory of Computation” (PDF). ;login: [англ.]. 36 (6): 13—21. Дата обращения 2024-06-30. Проверьте дату в |date= (справка на английском)
  2. Bratus, Sergey; Darley, Trey; Locasto, Michael E.; Patterson, Meredith L.; Shabiro, Rebecca; Shubina, Anna (январь 2014). “Beyond Planted Bugs in "Trusting Trust": The Input-Processing Frontier”. IEEE Security & Privacy [англ.]. 12 (1): 83—87. DOI:10.1109/MSP.2014.1. Дата обращения 2024-06-30. Проверьте дату в |date= (справка на английском); |access-date= требует |url= (справка)
  3. Dullien, Thomas (1 апреля 2020). “Weird Machines, Exploitability, and Provable Unexploitability”. IEEE Transactions on Emerging Topics in Computing [англ.]. 8 (2): 391—403. DOI:10.1109/TETC.2017.2785299. Дата обращения 2024-06-30. |access-date= требует |url= (справка)
  4. Vanegue, Julien. The Weird Machines in Proof-Carrying Code // The Weird Machines in Proof-Carrying Code : [англ.]. — IEEE, 2014. — P. 209–213. — ISBN 978-1-4799-5103-1. — doi:10.1109/SPW.2014.37.
  5. Stephen, Dolan mov is Turing-complete (англ.). Дата обращения: 30 июня 2024.

Категории