fedora 21 permite ao usuário sobrescrever um arquivo que ele não tem acesso

0

Eu reproduzi esse problema em duas máquinas fedora 21.

Eu gostaria que sqlite3 não escrevesse o arquivo ~/.sqlite_history . Eu não consegui encontrar uma opção, mas disse, não importa, eu vou fazer com que ela não possa escrever.

No entanto, ainda pode escrever e eu não entendo.

~$  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)

Eu também tentei um link simbólico para /dev/null e também nesse caso o sqlite3 simplesmente sobrescreve o arquivo ?? O que está acontecendo? Como o sqlite consegue sobrescrever esse arquivo?

Eu fiz o ls no binário sqlite3 para verificar se realmente não é suid root e não é. Eu não entendi.

    
por Emmanuel Touzery 07.01.2015 / 10:04

2 respostas

2

Não é possível gravar nesse arquivo, mas, supondo que ele possa gravar no diretório, basta excluir o arquivo e criar um novo.

Você não precisa ser capaz de gravar em um arquivo para excluí-lo no modelo de privilégio linux porque a exclusão de um arquivo não o altera de forma alguma - ele altera o diretório que contém o arquivo. Portanto, é o diretório que você precisa poder gravar para excluir um arquivo.

    
por 07.01.2015 / 13:08
1

Tente usar "sudo chattr + i /.sqlite_history" Isso evitará que qualquer coisa (mesmo raiz) modifique o arquivo de destino. O i significa "imutável" e é usado regularmente para manter o DHCP sobrescrevendo o /etc/resolv.conf

Isso deve fazer o truque para você. Para mais informações: "man chattr". É uma ferramenta que permite definir todos os tipos de atributos de arquivo maravilhosos!

Boa sorte

    
por 07.01.2015 / 21:32