2.3 M´ etriques de protection
2.3.3 Equivalence de gadgets
La classification syntaxique des gadgets a quelques limitations sur le d´enombrement de gadgets uniques pr´esents dans un binaire. Consid´erons les deux gadgets suivants : pop %rbx; add %rax,0; retet add %rax,0; pop %rbx; ret. Ils sont syntaxiquement diff´erents et donc class´es comme tels dans notre analyse pr´ec´edente. Ils font cependant la mˆeme op´eration, dans un ordre diff´erent. Les ins-tructions add et pop sont ici commutables, car elles utilisent des registres diff´erents. Cette section pr´esente une forme normale de gadget permettant d’identifier ces deux gadgets comme ´equivalents.
Deux instructions sont commutables si la premi`ere n’´ecrit pas dans les registres lus par la seconde et si la seconde n’´ecrit pas dans les registres lus par la premi`ere. D´efinition. Soit deux instructions i et i0.
i ↔ i0 ssi w(i) ∩ r(i0) = ∅ ∧ w(i0) ∩ r(i) = ∅ ∧ w(i0) ∩ w(i) = ∅
o`u w(i) (resp. i0) est l’ensemble des registres potentiellement ´ecrits par i (resp. i0) et r(i) (resp. i0) l’ensemble des registres potentiellement lus par i (resp. i0)
Les registres implicites sont aussi consid´er´es. Par exemple l’instruction pop %rbx modifie le registre %rsp, puisqu’il est d´ecr´ement´e de 8. L’instruction add %rax,0 va potentiellement toucher les fanions du registre EFLAGS. Ce registre est donc toujours consid´er´e comme modifi´e par cette instruction. Enfin les ins-tructions critiques qui changent le flot d’ex´ecution ou le contexte d’ex´ecution sont
2.3. M ´ETRIQUES DE PROTECTION 65
toujours d´efinies comme non commutables. Par exemple les instructions syscall, break ou encore sysexit sont pr´esentes dans cette cat´egorie. Pour d´eterminer les w et r de toutes les instructions de la famille x86, je me suis bas´e sur la r´ef´erence des instructions disponible ici3. L’int´egralit´e des registres touch´es, acc`es m´emoires et autres particularit´es des instructions de l’architecture y est d´etaill´e.
L’assembleur utilis´e dans le document est celui d’Intel contrairement `a celui qui est utilis´e par ROPgadget. Une traduction de certaines instructions de l’assembleur GNU (GAS) vers l’assembleur Intel a ´et´e r´ealis´ee. Par exemple l’instruction RET
utilis´ee par ROPgadget n’est pas pr´esente dans le document `a disposition, qui utilise RETN. La correspondance ´etant directe avec le document, quelques instructions ont n´ecessit´e ces traductions suppl´ementaires. Le tableau 2.4 liste toutes les traductions que j’ai op´er´ees. Certaines traductions avec changement d’op´erandes entre les formalismes, par exemple implicite dans l’assembleur Intel et explicite pour GAS, ne sont pas pr´ecis´ees dans le tableau.
Ensuite une relation d’ordre entre les instructions a ´et´e d´efinie. Cette relation va permettre de mettre en place une forme minimale d’un gadget en triant les instructions commutables du corps du gadget. Cette relation d’inf´eriorit´e d’une instruction sur une autre est applicable sur deux instructions commutables. Soit deux instructions a et b telles que a ↔ b. On d´efinit la relation d’ordre entre a et b en algorithme 1.
On d´efinit la commutation adjacente de deux gadgets comme suit :
D´efinition. X = (x1, ..., xn) ≡ Y = (y1, ..., yn) ssi ∃i < n, xi = yi+1, xi+1 = yi, xi ↔ xi+1, ∀j < n, j 6= i et j 6= i + 1 ⇒ xj = yj
Cette d´efinition n’est cependant pas transitive. Elle n’est donc pas suffisante pour lier des gadgets entre eux. Elle permet quand mˆeme d’avoir une premi`ere classe de similitude pour des gadgets. Cette premi`ere relation est utilis´ee pour mettre en place une relation d’´equivalence ensuite.
Pour mettre en place cette relation d’´equivalence transitive, on effectue une compl´etion transitive de l’´equivalence pr´ec´edemment d´efinie. Pour cela, j’ai com-menc´e par mettre en place une relation d’ordre sur l’ensemble des formes que peut prendre un gadget.
D´efinition. L’ordre de deux gadgets X et Y est donn´e par l’ordre de leur premi`ere instruction distincte.
if b fait au moins un acc`es m´emoire et pas a then a ≺ b
else if (a et b) ou (ni a ni b) n’ont d’acc`es m´emoire then if b modifie au moins un registre et pas a then
a ≺ b else
Soit no a et no
b le nombre d’op´erandes de a et b; if no
a< no b then a ≺ b
else
L’ordre de a et b est l’ordre lexicographique de leur premier op´erande respectif distinct;
end end else
b ≺ a end
Algorithme 1 : Ordre entre deux instructions commutables a et b
L’ensemble des permutations que l’on peut atteindre en partant de X, en ne faisant que des permutations l´egales, peut ˆetre ordonn´e avec la relation d’ordre pr´ec´edemment d´efinie. La proc´edure de r´eduction d’un gadget est comme suit :
X = (x1, ..., xn);
while ∃i < n tel que xi ↔ xi+1 et xi+1< xi do X = (x1, ..., xi+1, xi, ..., xn);
end
Algorithme 2 : R´eduction en forme minimale
La forme de X obtenue `a la fin de l’ex´ecution de l’algorithme est appel´ee forme minimale de X. En se basant sur cette r´eduction, on peut d´efinir une relation d’´equivalence g´en´eralis´ee de la mani`ere suivante.
D´efinition. Deux gadgets sont dits ´equivalents si et seulement si ils ont la mˆeme forme minimale.
Cette nouvelle d´efinition a l’avantage d’ˆetre transitive et permet de faire plus facilement des distinctions entre diff´erents gadgets.
2.3. M ´ETRIQUES DE PROTECTION 67 Ensemble des gadgets possibles e1 e2 e3 e4 e5 e6 e7 < > > < < Transformation par commutation >
Figure 2.8 – Compl´etion transitive de la relation d’ordre des gadgets
Cette r´eduction et ´equivalence est illustr´ee en figure 2.8. Cette figure pr´esente l’ensemble des permutations d’un gadget qui peuvent exister. Sur cette figure on peut voir la r´eduction du gadget e3 vers e7 en passant successivement par les gadgets e1 et e2. Le gadget e4 se r´eduit aussi en e7 en passant par le gadget e2. Les gadgets e1, e2, e3, e4 et e7 ont donc la mˆeme forme minimale e7. Ils sont donc ´equivalents. Les gadgets e5 et e6 sont compos´es des mˆemes instructions, mais ils n’existent pas de commutations possibles pour r´eduire e6 vers un des autres gadgets. e5 et e6 ne sont donc pas ´equivalents aux autres gadgets ´ecrits avec les mˆemes instructions.
R´ealisation
J’ai donc utilis´e cette relation d’´equivalence pour ´etudier de mani`ere plus pr´ecise l’unicit´e des gadgets pr´esents dans des binaires. Les r´esultats pr´ec´edemment peuvent donc ˆetre consolid´es en ne travaillant plus sur l’unicit´e syntaxique des gadgets, mais sur les gadgets ´equivalents.
r´esultats pr´esent´es dans la section suivante ne concernent donc que ces architectures. La m´ethodologie utilis´ee ici n’est pas incompatible avec d’autres architectures. Il faut cependant classifier les instructions de toutes ces architectures ou utiliser un formalisme d’instruction ind´ependant de l’architecture. Les r´esultats sur l’architec-ture x86, qui repr´esente environ 85 % du corpus, n’ont pas pu justifier le travail `a fournir pour faire cette adaptation.