
Непроверенный PoC повышения привилегий в ядре Linux, использующий переиспользование кросс-кэша msg_msgseg для перекрытия skb и pipe_buffer, изменяющий флаги pipe для чтения /etc/passwd.
Только для экспериментальных исследований. Код prefetch и nperm (требующий установки памяти set.gdb) не приложен, оптимизация не проводилась, вероятность попадания низкая.
Автор обратил внимание, что автор данной уязвимости уже опубликовал информацию о ней: https://github.com/google/security-research/pull/414
Идея эксплуатации кардинально отличается. Поскольку данный подход не был полностью проверен, я придерживаюсь консервативного мнения (главным образом, возможность гонки спин-лока sock не проверялась на практике; судя по неполному пониманию кода, гонку можно вызвать через аппаратное прерывание timerfd).
Предварительный анализ: https://xz.aliyun.com/news/92649
Идея эксплуатации: msg_msgseg через cross_cache повторно использует tipc_sock, подделывает некоторые поля, проходит все проверки и в итоге освобождает его; затем создаётся overlap между skb и pipe_buffer, изменяются flags в pipe_buffer (splice файла /etc/passwd в режиме только для чтения с последующим изменением flags — расширенная идея эксплуатации dirtypipe). Поскольку адрес кучи ядра не был раскрыт, подделанный sk->lock.wq не может указывать на себя; чтобы пройти проверку, curr->func (исходный код см. в цепочке вызовов __wake_up_common) подделывается как ret, поэтому реализация dataonly не совсем полная.