fedora 21 позволяет пользователю перезаписать файл, к которому у него нет доступа
Я воспроизвел эту проблему на двух машинах fedora 21.
Я бы этого хотел sqlite3
не пишет ~/.sqlite_history
файл. Я не мог найти вариант, но сказал, что я сделаю так, чтобы он не мог написать.
Однако, это все еще может написать, и я не понимаю.
~$ which sqlite3
/usr/bin/sqlite3
~$ ls -l /usr/bin/sqlite3
-rwxr-xr-x. 1 root root 69456 Nov 25 12:00 /usr/bin/sqlite3
~$ ls -l .sqlite_history
ls: cannot access .sqlite_history: No such file or directory
~$ touch .sqlite_history
~$ sudo chown root .sqlite_history
[sudo] password for emmanuel:
~$ sudo chmod 600 .sqlite_history
~$ sudo chgrp root .sqlite_history
~$ ls -l .sqlite_history
-rw------- 1 root root 0 Jan 7 08:45 .sqlite_history
~$ whoami
emmanuel
~$ groups
emmanuel wheel
~$ echo test > .sqlite_history
bash: .sqlite_history: Permission denied
~$ sqlite3 test.db
SQLite version 3.8.7.2 2014-11-18 20:57:56
Enter ".help" for usage hints.
sqlite> select * from server;
Error: no such table: server
sqlite>
~$ cat .sqlite_history
select * from server;
~$ ls -l .sqlite_history
-rw------- 1 emmanuel emmanuel 22 Jan 7 08:45 .sqlite_history
$ mount | grep home
/dev/sda7 on /home type ext4 (rw,relatime,data=ordered)
Я также попробовал символическую ссылку на /dev/null
а также в этом случае sqlite3 просто перезаписывает файл?? Что здесь происходит? Почему sqlite удается перезаписать этот файл?
Я сделал ls
на sqlite3
двоичный файл, чтобы проверить, что это действительно не suid root и это не так. Я не понимаю
2 ответа
Он не может записать в этот файл, но при условии, что он может записать в каталог, он может просто удалить файл и создать новый.
Вам не нужно иметь возможность записи в файл, чтобы удалить его в соответствии с моделью привилегий linux, поскольку удаление файла никоим образом не меняет его - оно меняет каталог, в котором находится файл. Так что это каталог, в который вы должны быть в состоянии записать, чтобы удалить файл.
Попробуйте использовать "sudo chattr +i /.sqlite_history". Это предотвратит изменение целевым файлом чего-либо (даже root). "I" означает "неизменный" и регулярно используется для предотвращения перезаписи DHCP /etc/resolv.conf.
Это должно помочь вам. Для получения дополнительной информации: "man chattr". Это инструмент, который позволяет вам устанавливать всевозможные замечательные атрибуты файлов!
Удачи