Return-Oriented Programming
O que é Return-Oriented Programming?
Return-Oriented ProgrammingROP e uma tecnica de exploracao por reuso de codigo que encadeia pequenas sequencias de instrucoes terminadas em RET para executar computacao arbitraria sem injetar codigo.
Hovav Shacham introduziu o ROP no artigo de 2007 "The Geometry of Innocent Flesh on the Bone", mostrando que o return-into-libc podia ser generalizado até uma computação Turing-completa e, assim, derrotar DEP/W^X. O atacante corrompe a pilha e escreve uma cadeia de endereços, cada um apontando para um gadget curto — poucas instruções terminadas em RET. Após cada gadget executar, RET retira o endereço seguinte, de modo que o controlo flui por bytes executáveis já existentes (libc, o programa, as bibliotecas), sem código injetado que o DEP possa apanhar.
Como cada endereço de gadget é absoluto, o ROP depende de saber onde o código está em memória — exatamente o que o ASLR aleatoriza; por isso os exploits reais combinam-no com uma fuga de informação. As variantes generalizam a primitiva: JOP (saltos) e COP (chamadas) encadeiam saltos/chamadas indiretas em vez de retornos, e SROP (sigreturn) abusa da restauração do frame de sinal do kernel para definir todos os registos de uma vez. O Blind ROP (Bittau et al., 2014) constrói uma cadeia contra um serviço remoto sem binário, observando os crashes.
O ROP é a principal razão de toda uma geração de mitigações. As defesas atacam uma de três superfícies: disponibilidade de gadgets, integridade do fluxo de controlo ou segurança de memória na origem. O Intel CET (desde Tiger Lake, 2020) impõe uma shadow stack por hardware que deteta endereços de retorno alterados e Indirect Branch Tracking (endbr64) contra JOP/COP; a ARM oferece Pointer Authentication e BTI. Linguagens de memória segura como Rust eliminam o erro de corrupção que inicia a cadeia.
flowchart TD A["Erro de corrupcao de memoria<br/>estouro de pilha"] --> B["Sobrescreve endereco de retorno"] B --> C["A pilha contem agora<br/>uma cadeia de gadgets"] C --> G1["Gadget 1: pop rdi, ret"] G1 --> G2["Gadget 2: pop rsi, ret"] G2 --> G3["Gadget 3: syscall, ret"] G3 --> X["execve /bin/sh"] D1["DEP: pilha nao executavel"] -. contornado por reuso .-> C D2["ASLR"] -. exige fuga de info .-> C D3["Shadow stack do Intel CET"] -. bloqueia RET invalido .-> G1
● Exemplos
- 01
Exploit encadeia gadgets pop-rdi/syscall da glibc para chamar execve("/bin/sh").
- 02
Exploit de kernel combina fuga de KASLR e ROP para commit_creds(prepare_kernel_cred(0)).
● Perguntas frequentes
O que é Return-Oriented Programming?
ROP e uma tecnica de exploracao por reuso de codigo que encadeia pequenas sequencias de instrucoes terminadas em RET para executar computacao arbitraria sem injetar codigo. Pertence à categoria Segurança de aplicações da cibersegurança.
O que significa Return-Oriented Programming?
ROP e uma tecnica de exploracao por reuso de codigo que encadeia pequenas sequencias de instrucoes terminadas em RET para executar computacao arbitraria sem injetar codigo.
Como se defender contra Return-Oriented Programming?
As defesas contra Return-Oriented Programming costumam combinar controles técnicos e práticas operacionais, conforme detalhado na definição acima.
Quais são outros nomes para Return-Oriented Programming?
Nomes alternativos comuns: ROP, Ataque de reuso de codigo, Return-to-libc.