Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 1036

Возвратно-ориентированное программирование (ROP)

ПроверилCybersecurity entrepreneur & security researcher

Что такое Возвратно-ориентированное программирование (ROP)?

Возвратно-ориентированное программирование (ROP)ROP — техника эксплуатации с повторным использованием кода, в которой короткие последовательности инструкций, оканчивающиеся RET, выстраиваются в цепочку для выполнения произвольных вычислений без внедрения нового кода.


Ховав Шахам представил ROP в статье 2007 года «The Geometry of Innocent Flesh on the Bone», показав, что return-into-libc можно обобщить до тьюринг-полных вычислений и тем самым обойти DEP/W^X. Атакующий повреждает стек и записывает цепочку адресов, каждый из которых указывает на короткий гаджет — несколько инструкций, оканчивающихся RET. После выполнения каждого гаджета RET извлекает следующий адрес, поэтому управление течёт по уже существующим исполняемым байтам (libc, сама программа, библиотеки) без внедрённого кода, который мог бы перехватить DEP.

Поскольку адрес каждого гаджета абсолютен, ROP требует знания расположения кода в памяти — именно это рандомизирует ASLR; поэтому реальные эксплойты сочетают ROP с утечкой информации. Варианты обобщают приём: JOP (переходы) и COP (вызовы) связывают косвенные переходы/вызовы вместо возвратов, а SROP (sigreturn) злоупотребляет восстановлением кадра сигнала ядра, задавая все регистры разом. Blind ROP (Bittau и др., 2014) строит цепочку против удалённого сервиса без двоичного файла, наблюдая за сбоями.

ROP — главная причина появления целого поколения средств защиты. Защита атакует одну из трёх поверхностей: доступность гаджетов, целостность потока управления или безопасность памяти в исходном коде. Intel CET (с Tiger Lake, 2020) обеспечивает аппаратный теневой стек, выявляющий подменённые адреса возврата, и Indirect Branch Tracking (endbr64) против JOP/COP; ARM предлагает Pointer Authentication и BTI. Языки с безопасной памятью, такие как Rust, устраняют саму ошибку повреждения, с которой начинается цепочка.

flowchart TD
  A["Ошибка порчи памяти<br/>переполнение стека"] --> B["Перезапись адреса возврата"]
  B --> C["В стеке теперь<br/>цепочка гаджетов"]
  C --> G1["Гаджет 1: pop rdi, ret"]
  G1 --> G2["Гаджет 2: pop rsi, ret"]
  G2 --> G3["Гаджет 3: syscall, ret"]
  G3 --> X["execve /bin/sh"]
  D1["DEP: стек неисполняемый"] -. обходится повторным использованием .-> C
  D2["ASLR"] -. нужна утечка .-> C
  D3["Теневой стек Intel CET"] -. блокирует неверный RET .-> G1

Примеры

  1. 01

    Эксплойт связывает гаджеты pop-rdi/syscall в glibc для вызова execve("/bin/sh").

  2. 02

    Эксплойт ядра использует утечку KASLR и ROP к commit_creds(prepare_kernel_cred(0)).

Частые вопросы

Что такое Возвратно-ориентированное программирование (ROP)?

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

Что означает Возвратно-ориентированное программирование (ROP)?

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

Как защититься от Возвратно-ориентированное программирование (ROP)?

Защита от Возвратно-ориентированное программирование (ROP) обычно сочетает технические меры и операционные практики, как описано в определении выше.

Какие есть другие названия Возвратно-ориентированное программирование (ROP)?

Распространённые альтернативные названия: ROP, Атака повторного использования кода, Return-to-libc.

Связанные термины

См. также