First Fit

рд╣реИрдХрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдкрд╣рд▓рд╛ рдлрд┐рдЯ

рдЬрдм рдЖрдк glibc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЗрдореЛрд░реА рдЪрдВрдХреНрд╕ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди "рдмрд┐рди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рд╡рд░рдг рд╣реИ: рдЕрдирдХреНрд░рдорд┐рдд рдмрд┐рдиреНрд╕ рдФрд░ рдлрд╛рд╕реНрдЯрдмрд┐рдиреНрд╕ред

рдЕрдирдХреНрд░рдорд┐рдд рдмрд┐рдиреНрд╕

рдЬрдм рдЖрдк рдПрдХ рдореЗрдореЛрд░реА рдЪрдВрдХ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рддреЗрдЬ рдЪрдВрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЕрдирдХреНрд░рдорд┐рдд рдмрд┐рди рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд┐рди рдПрдХ рд╕реВрдЪреА рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдирдП рдореБрдХреНрдд рдЪрдВрдХреНрд╕ рдХреЛ рд╕рд┐рд░реЗ (рд╢реАрд░реНрд╖) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдирдИ рдореЗрдореЛрд░реА рдЪрдВрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрд╡рдВрдЯрдХ рдЙрд╕ рдЕрдирдХреНрд░рдорд┐рдд рдмрд┐рди рдХреА рдУрд░ рджреЗрдЦрддрд╛ рд╣реИ рдкреАрдЫреЗ рд╕реЗ (рдкреВрдВрдЫ) рддрд╛рдХрд┐ рдПрдХ рдЪрдВрдХ рдвреВрдВрдв рд╕рдХреЗ рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝рд╛ рд╣реЛред рдЕрдЧрд░ рдЕрдирдХреНрд░рдорд┐рдд рдмрд┐рди рд╕реЗ рдПрдХ рдЪрдВрдХ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд┐рди рдореЗрдВ рдмрдЪрд╛ рд╣реБрдЖ рд╣рд┐рд╕реНрд╕рд╛ рд░рд╣рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

  • рдЖрдк 300 рдмрд╛рдЗрдЯ (a) рдХрд╛ рдЖрд╡рдВрдЯрди рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ 250 рдмрд╛рдЗрдЯ (b) рдХрд╛, рдлрд┐рд░ a рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ 250 рдмрд╛рдЗрдЯ (c) рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред

  • рдЬрдм рдЖрдк a рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдирдХреНрд░рдорд┐рдд рдмрд┐рди рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

  • рдЕрдЧрд░ рдлрд┐рд░ рд╕реЗ 250 рдмрд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрд╡рдВрдЯрдХ a рдХреЛ рдкреВрдВрдЫ рдкрд░ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдлрд┐рдЯ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдЪрд╛ рд╣реБрдЖ рд╣рд┐рд╕реНрд╕рд╛ рдмрд┐рди рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред

  • c рдкрд┐рдЫрд▓реЗ a рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ рдФрд░ a рдХреЗ рд╕рд╛рде рднрд░рд╛ рд╣реЛрдЧрд╛ред

char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

рдлрд╛рд╕реНрдЯрдмрд┐рдиреНрд╕

рдлрд╛рд╕реНрдЯрдмрд┐рдиреНрд╕ рдЫреЛрдЯреЗ рдореЗрдореЛрд░реА рдЪрдВрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдирд╕реЙрд░реНрдЯреЗрдб рдмрд┐рдиреНрд╕ рдХреА рддрд░рд╣, рдлрд╛рд╕реНрдЯрдмрд┐рдиреНрд╕ рдирдП рдЪрдВрдХ рдХреЛ рд╣реЗрдб рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рд▓рд╛рд╕реНрдЯ-рдЗрди-рдлрд░реНрд╕реНрдЯ-рдЖрдЙрдЯ (LIFO) рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЪрдВрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрд▓реЛрдХреЗрдЯрд░ рдлрд╛рд╕реНрдЯрдмрд┐рди рдХреЗ рд╣реЗрдб рд╕реЗ рдЦреАрдВрдЪреЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг:

  • рдЖрдк рдЪрд╛рд░ рдЪрдВрдХреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ 20 рдмрд╛рдЗрдЯ рдХреЗ (a, b, c, d).

  • рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдлреНрд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлреНрд░реА рдХрд┐рдП рдЧрдП рдЪрдВрдХреНрд╕ рдлрд╛рд╕реНрдЯрдмрд┐рди рдХреЗ рд╣реЗрдб рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

  • рдЕрдЧрд░ рдлрд┐рд░ рдЖрдк 20 рдмрд╛рдЗрдЯ рдХрд╛ рдЪрдВрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрд▓реЛрдХреЗрдЯрд░ рдлрд╛рд╕реНрдЯрдмрд┐рди рдХреЗ рд╣реЗрдб рд╕реЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдлреНрд░реА рдХрд┐рдП рдЧрдП рдЪрдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред

char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20);   // d
b = malloc(20);   // c
c = malloc(20);   // b
d = malloc(20);   // a

рдЕрдиреНрдп рд╕рдВрджрд░реНрдн рдФрд░ рдЙрджрд╛рд╣рд░рдг

  • ARM64. Use after free: рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ, рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░реЗрдВ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдЬреЛ рдореБрдХреНрдд рдЪрдВрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛->рдкрд╛рд╕рд╡рд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░реЗрдВред рдкрд╛рд╕рд╡рд░реНрдб рдЬрд╛рдВрдЪ рдХреЛ рдЫрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреБрдирдГ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

  • рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЛрдЯреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдиреЛрдЯ рдореЗрдВ рдиреЛрдЯ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рдЬреЛ malloc(8) рдореЗрдВ рд╣реЛрдЧреА (рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреЙрдЗрдВрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рдиреЛрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ malloc(<size>) рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛ред

  • рд╣рдорд▓рд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ 2 рдиреЛрдЯреНрд╕ (рдиреЛрдЯ0 рдФрд░ рдиреЛрдЯ1) рдмрдирд╛рдПрдВ рдЬрд┐рдирдореЗрдВ рдиреЛрдЯ рдЬрд╛рдирдХрд╛рд░реА рдЖрдХрд╛рд░ рд╕реЗ рдмрдбрд╝реА malloc рд╕рд╛рдордЧреНрд░реА рд╣реЛрдЧреА рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рддреЗрдЬ рдмрд┐рди (рдпрд╛ рдЯреАрдХреИрд╢) рдореЗрдВ рдЖ рдЬрд╛рдПрдВред

  • рдлрд┐рд░, рдПрдХ рдФрд░ рдиреЛрдЯ (рдиреЛрдЯ2) рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ 8 рд╣реЛред рд╕рд╛рдордЧреНрд░реА рдиреЛрдЯ1 рдореЗрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЪрдВрдХ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЬреАрдд рдлрд╝рдВрдХреНрд╢рди рдХреА рдУрд░ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ Use-After-Free рдиреЛрдЯ1 рдХреЛ рдирдП рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

  • рдХреБрдЫ рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рд▓рд┐рдЦрдирд╛, рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░рдирд╛, рдкреБрдирдГ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓рд╛ рдбреЗрдЯрд╛ рдЕрдм рднреА рд╡рд╣рд╛рдБ рд╣реИ, рдЗрд╕реЗ рдирдП рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдЪрдВрдХ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдирд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореВрд▓реНрдп рд╕реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдЭрдВрдбрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛред

  • рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрдВрдХ рдореЗрдВ 4 рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓рд╛ рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рд╕рднреА рдХреЛ рдордЬрдмреВрд░ рдХрд░рдХреЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА)ред рдкреНрд░рддреНрдпреЗрдХ рдирдП рдЖрд╡рдВрдЯрд┐рдд рдЪрдВрдХ рдкрд░ рдЗрд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рд░рдгреА рд╕реВрдЪрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░, 4 рдЪрдВрдХреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ (+ рдкрд╣рд▓реЗ рдЖрд╡рдВрдЯрд┐рдд), рдЖрдЦрд┐рд░реА рд╡рд╛рд▓рд╛ рдореЗрдВ 4 рд╣реЛрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд╛ рдкреБрдирдГ рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВ, рдЬреЛ рдЖрдЦрд┐рд░реА рдЪрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ 4 рд╣реИред

Last updated