Есть ли какой-либо способ в Java безопасно записывать во временный файл?
Насколько я могу судить, единственный способ создать временный файл (createTempFile) на самом деле открывает его в одно и то же время, поэтому существует условие гонки между открытием файла и записью файла. Я что-то упускаю? Я не смог найти исходный код C вместо createFileExclusive (String) в UnixFileSystem.java, но я сомневаюсь, что он действительно может что-либо сделать, поскольку файл открывается в коде Java после создания файла temp (если он не пытается что-то сделать с файловые блокировки?).
Проблема
Между тем, когда создается временный файл и вы его открываете, злоумышленник может отсоединить этот временный файл и поместить туда вредоносный файл. Например, злоумышленник может создать именованный канал для чтения конфиденциальных данных. Или аналогично, если вы в конечном итоге скопируете файл, прочитав его, тогда именованный канал может просто игнорировать все написанное и предоставлять вредоносное содержимое для чтения.
Я помню, как читал многочисленные примеры временных файловых атак за последние 10 лет, которые используют условие гонки между тем, когда имя появляется в пространстве имен и когда файл фактически открыт.
Надеюсь, смягчающим фактором является то, что Java правильно задала umask, поэтому менее привилегированный пользователь не может читать/записывать в файл, и обычно каталог /tmp правильно разрешает права доступа, чтобы вы не могли выполнить атаку unlink.
Конечно, если вы передадите пользовательский каталог временного файла, принадлежащего менее привилегированному пользователю, который скомпрометирован, пользователь может сделать атаку unlink против вас. Черт, с inotify, возможно, даже легче использовать условие гонки, чем просто цикл грубой силы, который делает список каталогов.