# Return-oriented programming

La programació orientada al retorn (ROP) és una tècnica d'explotació de seguretat informàtica que permet a un atacant executar codi en presència de defenses de seguretat com ara la protecció de l'espai executable i la signatura de codi.
En aquesta tècnica, un atacant aconsegueix el control de la pila de crides per segrestar el flux de control del programa i després executa seqüències d'instruccions de màquina escollides amb cura que ja estan presents a la memòria de la màquina, anomenades "gadgets". Cada gadget normalment acaba en una instrucció de retorn i es troba en una subrutina dins del programa existent i/o del codi de biblioteca compartida. Encadenats, aquests aparells permeten a un atacant realitzar operacions arbitràries en una màquina que empra defenses que frustran atacs més senzills.

## Rerfons

La programació orientada al retorn és una versió avançada d'un atac de trencament de pila. En general, aquests tipus d'atacs sorgeixen quan un adversari manipula la pila de crides aprofitant un error al programa, sovint un desbordament de memòria intermèdia. En un desbordament de memòria intermèdia, una funció que no realitza una comprovació adequada dels límits abans d'emmagatzemar les dades proporcionades per l'usuari a la memòria acceptarà més dades d'entrada de les que pot emmagatzemar correctament. Si les dades s'estan escrivint a la pila, l'excés de dades pot desbordar l'espai assignat a les variables de la funció (per exemple, "locals" al diagrama de pila de la dreta) i sobreescriure l'adreça de retorn. Aquesta adreça serà utilitzada més tard per la funció per redirigir el flux de control a la persona que truca. Si s'ha sobreescrit, el flux de control es desviarà a la ubicació especificada per la nova adreça de retorn.
En un atac estàndard de desbordament de memòria intermèdia, l'atacant simplement escriuria el codi d'atac (la "càrrega útil") a la pila i després sobreescriuria l'adreça de retorn amb la ubicació d'aquestes instruccions acabades de escriure. Fins a finals de la dècada de 1990, els principals sistemes operatius no oferien cap protecció contra aquests atacs; Microsoft Windows no va oferir cap protecció contra desbordament de la memòria intermèdia fins al 2004. Finalment, els sistemes operatius van començar a combatre l'explotació d'errors de desbordament de memòria intermèdia marcant la memòria on s'escriuen les dades com a no executables, una tècnica coneguda com a protecció de l'espai executable. Amb això activat, la màquina es negaria a executar qualsevol codi que es trobi a les àrees de memòria escrivibles per l'usuari, evitant que l'atacant col·loqui la càrrega útil a la pila i hi salti mitjançant una sobreescritura d'adreça de retorn. Més tard es va disposar de suport de maquinari per reforçar aquesta protecció.
Amb la prevenció de l'execució de dades, un adversari no pot executar directament instruccions escrites en una memòria intermèdia perquè la secció de memòria de la memòria intermèdia està marcada com a no executable. Per derrotar aquesta protecció, un atac de programació orientat al retorn no injecta instruccions malicioses, sinó que utilitza seqüències d'instruccions ja presents a la memòria executable, anomenades "gadgets", manipulant adreces de retorn. Una implementació típica de prevenció d'execució de dades no pot defensar-se d'aquest atac perquè l'adversari no va executar directament el codi maliciós, sinó que va combinar seqüències d'instruccions "bones" canviant les adreces de retorn emmagatzemades; per tant, el codi utilitzat es marcaria com a executable.

## Atacs

La programació orientada al retorn es basa en l'enfocament dels fragments de codi prestats i l'estén per proporcionar la funcionalitat completa de Turing a l'atacant, incloent bucles i branques condicionals. Dit d'una altra manera, la programació orientada al retorn proporciona un "llenguatge" totalment funcional que un atacant pot utilitzar per fer que una màquina compromesa realitzi qualsevol operació desitjada. Hovav Shacham va publicar la tècnica l'any 2007 i va demostrar com es poden simular totes les construccions de programació importants mitjançant una programació orientada al retorn contra una aplicació objectiu enllaçada amb la biblioteca estàndard C i que conté una vulnerabilitat d'excés de memòria intermèdia explotable.
Un atac de programació orientat al retorn és superior als altres tipus d'atac comentats, tant en poder expressiu com en resistència a les mesures defensives. Cap de les tècniques de contra-explotació esmentades anteriorment, inclosa l'eliminació de funcions potencialment perilloses de les biblioteques compartides, és efectiva contra un atac de programació orientat al retorn.

## Referències

* ↑ Vázquez, Hugo. «Check Point Secure Platform Hack» (en anglès). Pentest p. 219. Pentest Consultores, 01-10-2007.
* ↑ «Thread: CheckPoint Secure Platform Multiple Buffer Overflows» (en anglès). The Check Point User Group.
* ↑ Shacham, Hovav. «Return-Oriented Programming: Exploits Without Code Injection» (en anglès). [Consulta: 12 agost 2009].
* ↑ Buchanan, E. «When Good Instructions Go Bad: Generalizing Return-Oriented Programming to RISC». A: Proceedings of the 15th ACM conference on Computer and communications security - CCS '08 (en anglès), October 2008, p. 27–38. DOI 10.1145/1455770.1455776. ISBN 978-1-59593-810-7.
* ↑ Abadi, M. N.. «Control-Flow Integrity: Principles, Implementations, and Applications». A: Proceedings of the 12th ACM conference on Computer and communications security - CCS '05 (en anglès), November 2005, p. 340–353. DOI 10.1145/1102120.1102165. ISBN 1-59593-226-7.
* ↑ Abadi, M. N.; Budiu, M.; Erlingsson, Ú.; Ligatti, J. ACM Transactions on Information and System Security, 13, 01-10-2009, pàg. 1–40. DOI: 10.1145/1609956.1609960.
* ↑ Shacham, H. «The geometry of innocent flesh on the bone: return-into-libc without function calls (on the x86)». A: Proceedings of the 14th ACM conference on Computer and communications security - CCS '07 (en anglès), October 2007, p. 552–561. DOI 10.1145/1315245.1315313. ISBN 978-1-59593-703-2.