Puncte:2

securitate ciudată a fișierelor pe Ubuntu 20.04

drapel ky

Ubuntu 20.04, formatul de partiție a discului este EXT4. utilizator normal cu privilegii sudo, într-un director tmp, de exemplu: ~/tmp/

$ sudo touch c.txt
// aceasta va crea un fișier root-root (grup de utilizatori) cu modul 644, așa cum era de așteptat.
$ rm c.txt
$ rm: eliminați fișierul gol obișnuit protejat la scriere „c.txt”? // promptul sys
dacă am selectat „y”, atunci c.txt va fi eliminat! // NU așa cum era de așteptat.

Am încercat chiar și fișierul rm care nu este gol, încă îl pot elimina!

Am încercat două computere ambele cu Ubutnu 20.04, la fel.

de ce utilizatorul normal poate elimina fișierul rădăcină fără sudo?

Mulțumiri!

P.s: După verificarea documentului https://help.ubuntu.com/community/FilePermissions da, utilizatorul normal poate șterge orice fișier dintr-un director complet controlat (rwx=7), indiferent de proprietarul fișierului, moduri. cu toate acestea, se pare că nu ar trebui să se aplice cu operația de modificare. de exemplu:

// TC2
sudo vim d.txt // aceasta va crea o rădăcină-rădăcină (grup de utilizatori) cu modul 644

vim d.txt   
// editează de către utilizator normal, folosește w! pentru a salva în vim, 
// după ieșirea din vim, conținutul fișierului s-a schimbat și grupul de utilizatori 
// schimbat la grupul de utilizatori curent, nu mai root-root.

Acesta este cum era de așteptat?

chenzero avatar
drapel ky
asta pentru că sunt proprietarul directorului ~/tmp/, deci pot gestiona toate fișierele de dedesubt, indiferent al cui proprietar este fișierul? Voi verifica asta cu un document oficial...
chenzero avatar
drapel ky
Este probabil unele inconsecvente în controlul permisiunii fișierelor. Dacă pot folosi pașii TC2 pentru a schimba conținutul, proprietarul și grupul unui fișier, de ce nu pot schimba direct fișierul prin comanda chown? Am încercat, dacă rulați $ chown chenzero d.txt în terminal, chown va afișa: operațiunea nu este permisă.
Puncte:5
drapel cn

La șterge un fișier dintr-un director tot ce ești permisiune pe directorul însuși permisiunile pentru acel fișier sunt irelevante. În cazul dvs., utilizatorul normal are permisiunea completă pentru directorul care conține fișierul în el. îl puteți schimba în imuabil pentru a preveni ștergerea acestuia: sudo chattr +i fișier

SAU:

sudo chmod o-w /path_to_directory

drapel au
Modul în care mă gândesc la asta este că permisiunile unui fișier se aplică *conținutului său*. Ștergerea, mutarea sau redenumirea unui fișier nu afectează conținutul acestuia, astfel încât permisiunile asupra acestuia sunt irelevante; aceste operațiuni modifică conținutul directorului (și, pentru mutare, directorul în care se mută), deci este necesară permisiunea de scriere a directorului(e). Când „ștergeți” un fișier, chiar îl eliminați („dezlegați”) din director și, dacă nu mai există intrări de director („linkuri”) pentru el, pur și simplu iese din existență.
chenzero avatar
drapel ky
Multumesc, am incercat acest caz: sudo vim d.txt ; // aceasta va crea un fișier root-root 644 vim d.txt ; // editează cu utilizatorul normal, chiar și promptul vim editează un fișier numai în citire, pot folosi w! pentru a salva, iar rezultatul este, utilizatorul normal poate modifica fișierul deținut de root
TooTea avatar
drapel cn
@chenzero Nu este adevărat. Un utilizator normal nu poate modifica un fișier deținut de root, dar un utilizator normal poate înlocui un fișier deținut de root cu un fișier nou deținut de acel utilizator, atâta timp cât se întâmplă într-un director care poate fi scris pentru utilizator.
drapel st
@GordonDavisson: De fapt, așa funcționează directoarele și în viața reală și, de fapt, *de ​​ce* Unix le numește directoare și nu „foldere”, așa cum fac alte sisteme de operare. Dacă vreau să te șterg din directorul de contacte al telefonului meu, nu trebuie să te ucid, până la urmă.Dacă vreau să șterg un fișier dintr-un folder, trebuie să am acces fizic atât la folder, cât și la fișierul din interiorul acestuia. Dacă vreau să șterg un fișier dintr-un director, tot ce am nevoie este accesul la director și apoi pot șterge sau șterge intrarea.
chenzero avatar
drapel ky
@TooTea Nu văd nicio diferență între înlocuirea și modificarea fișierului --- același rezultat atins, conținutul fișierului schimbat. Sunt foarte confuz cu de ce vim w! poate schimba conținutul fișierului, proprietarul fișierului și grupul? Vă rugăm să încercați TC2 în întrebarea mea. Mulțumiri.
drapel au
@chenzero Problema este că permisiunile sunt definite în termeni de operațiuni la nivel de sistem de fișiere, nu de efectul acelor operațiuni. Înlocuirea și schimbarea unui fișier au rezultate similare, dar sunt foarte diferite în ceea ce privește operațiunile sistemului de fișiere implicate, așa că permisiunile se aplică diferit între ele. Problema IMO este că permisiunile Unix au fost concepute de un expert în sisteme de fișiere, nu de un expert în securitate, deci au sens în ceea ce privește operațiunile sistemului de fișiere, dar nu în ceea ce privește definirea unei politici de securitate sănătoase.
raj avatar
drapel cn
raj
@chenzero Acest lucru se datorează de fapt unei aplicații prost proiectate, care, în loc să **scrie într-un fișier existent** pentru a-i schimba conținutul, mai întâi **șterge** fișierul și apoi **creează un fișier nou** cu același nume, în același director, cu conținut nou. Scrierea într-un fișier existent necesită permisiunea de scriere **pe fișier**; ștergerea și crearea unui fișier necesită doar o permisiune de scriere **într-un director**. Păcat că multe aplicații sunt scrise așa...
raj avatar
drapel cn
raj
@chenzero Un astfel de comportament al aplicației poate avea efecte secundare nedorite, de exemplu, dacă fișierul original a fost conectat în mai multe directoare. După ce aplicația înlocuiește fișierul în acest fel, acesta nu mai este legat de celelalte instanțe. Deci acest lucru nu ar trebui făcut... dar multe aplicații o fac oricum.
drapel au
@raj `vim` poate salva de fapt în orice mod -- în mod normal rescrie fișierul existent, dar dacă nu poate trece în modul ștergere și înlocuire. Multe alte programe fac acest lucru pentru a obține salvări mai aproape atomice: salvează sub un nume de temp, apoi șterg originalul și redenumiți temperatura în locul său; acest lucru evită lăsarea unui fișier corupt dacă ceva nu merge bine în timpul scrierii noii versiuni.
chenzero avatar
drapel ky
Multumesc pentru tot ajutorul tau! Am inteles ideea si sa ai o zi buna :)
drapel bg
@raj, mulți oameni ar fi în dezacord cu tine în legătură cu comportamentul pe care îl descrii fiind prost conceput. Există motive întemeiate pentru a-l prefera în locul suprascrierii fișierului original.
Puncte:1
drapel ua

Un director este o listă de fișiere și subdirectoare (mai precis, pentru fiecare intrare: un nume de fișier sau un nume de subdirector, utilizator deținător, grup deținător, biți de permisiune, permisiuni extinse, un pointer către locația de pe disc a fișierului/subdirectorului și suplimentar metadate ezoterice). Un director are un proprietar și un grup. Permisiunile directorului controlează ce utilizatori citesc, scriu și CD în acel director. Dacă doriți să creați un fișier într-un director, trebuie să aveți permisiunea de a scrie în director. Dacă doriți să eliminați un fișier dintr-un director, trebuie să aveți permisiunea de a scrie în director. Dacă doriți să redenumiți un fișier, trebuie să aveți permisiunea de a scrie în director. Dacă doriți să modificați permisiunile unui fișier, trebuie să aveți permisiunea de a scrie în director. Toate acestea sunt modificări ale directorului, deci folosiți permisiunile directorului. (Există excepții legate de permisiunile extinse, pe care le-am lăsat deoparte aici.)

În cele ce urmează, voi continua să scriu „intrarea de director pe care o utilizați pentru a o accesa” deoarece pot exista mai multe intrări de director, deci nume potențial diferite, pentru un fișier din sistemul de fișiere. De fapt, mai multe intrări dintr-un singur director (având în mod necesar nume diferite) pot indica același fișier de pe disc, iar diferitele intrări pot avea utilizator, grup proprietar și permisiuni diferite.

O intrare de fișier dintr-un director are utilizator proprietar, grup proprietar și permisiuni. Dacă doriți să citiți conținutul unui fișier, intrarea din director pe care o utilizați pentru a-l accesa trebuie să vă permită accesul de citire. Dacă doriți să scrieți conținutul unui fișier, intrarea de director pe care o utilizați pentru a-l accesa trebuie să vă permită accesul la scriere. Dacă doriți să executați conținutul unui fișier, intrarea de director pe care o utilizați pentru a-l accesa trebuie să vă permită accesul de execuție.

Așa că haideți să analizăm exemplul dvs.

  • Directorul de lucru actual este ~/tmp/, deci utilizatorul curent este utilizatorul proprietar, grupul proprietar și are permisiuni de citire+scriere+execuție pentru director.
  • sudo touch c.txt Aceasta creează un fișier cu utilizatorul proprietar rădăcină având permisiuni de citire+scriere, grup rădăcină având permisiuni de scriere și permisiuni de scriere pentru alți utilizatori. (4 = citiți, 2 = scrieți, 1 = executați; 6 = 4+2 = citiți + scrieți)
  • rm c.txt are avertismentul/promptul "rm: eliminați fișierul gol obișnuit protejat la scriere „c.txt”?„Acest avertisment înseamnă: utilizatorul actual are permisiuni de scriere în directorul curent, deci poate șterge acest fișier, dar utilizatorul actual are doar permisiuni de citire pentru conținutul acestui fișier, ceea ce sugerează că utilizatorul actual dorește să păstreze acest fișier împotriva modificărilor. Aceste două intenții sunt incompatibile, așa că se solicită îndrumări suplimentare.
  • Selectați y și c.txt este eliminat. Da. Aveți permisiunea de a șterge intrarea din director, deci atunci când răspundeți y, intrarea este ștearsă din director. Conținutul fișierului nu este scris sau executat în niciun moment (care este ceea ce permisiunile de introducere a fișierului ar interzice).

Al doilea scenariu funcționează și el, dar nu pentru motivul pe care îl așteptați. vim și mulți, mulți alți editori (inclusiv, ca exemplu aleatoriu, Microsoft Word), nu editează fișierul original. Ei copiază fișierul, apoi editează copia. Dacă editările nu sunt salvate, copia poate fi ștearsă. Dacă editările sunt salvate, fișierul original este șters din director și copia este redenumită cu numele originalului. Deci, să vedem ce se întâmplă.

testul mkdir
test cd
ls -laF

total 8
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:40 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:40 ../

Vedem că utilizatorul meu, neclarăși grupul meu, neclară deține directorul curent, ., iar 775 de permisiuni sunt setate (user neclară: rwx, grup neclară: rwx, altele: rx).

sudo vim d.txt
[furnizează parola]
[începe sesiunea vim]
[inserați modul]Bună.

Acum să trecem la un alt shell și să vedem ce se întâmplă în director.

[alt shell, nu sudo...]
test cd
ls -laF

total 20
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:44 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:44 ../
-rw------- 1 rădăcină rădăcină 12288 Oct 31 11:44 .d.txt.swp

Vedem că sudo vim a creat un fișier temporar numit .d.txt.swp cu proprietarii rădăcină.rădăcină și modul 600. Acum întoarceți-vă și salvați fișierul în sudo vim sesiune și verificați din nou.

ls -laF

total 12
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:48 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:48 ../
-rw-r--r-- 1 rădăcină rădăcină 4 oct 31 11:48 d.txt

Vedem că intrarea în directorul fișierului temporar a fost modificată pentru a avea un nou nume și noi permisiuni. Utilizatorul actual este aici neclară, care are doar permisiuni de citire pentru d.txt, dar asta-i tot neclară trebuie să deschidă fișierul într-un editor.

[prima sesiune, observați nu sudo...]
vim d.txt
[mergi la sfârșitul primului rând]
[adăuga. avertizat: „W10: Avertisment: modificarea unui fișier numai în citire”]
[introduceți un singur spațiu după „Bună.”]

De îndată ce am atașat după Bună. fișierul temporar vim a apărut în director.

[a doua sesiune]
ls -laF

total 16
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 11:53 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 11:52 ../
-rw-r--r-- 1 rădăcină rădăcină 4 oct 31 11:48 d.txt
-rw------- 1 fuzzy fuzzy 4096 Oct 31 11:53 .d.txt.swp

Acest director are permisiuni rwx pentru utilizator neclară, deci crearea acestei intrări este permisă. Ca de obicei, vim menține permisiunile fișierelor temporare foarte stricte.

[prima sesiune]
[ieșiți din modul de inserare]
[Esc]:w
[obține eroare: „E45: opțiunea „numai citire” este setată (adăugați ! pentru a înlocui)”]

Aceasta înseamnă că intrarea inițială a directorului nu are permisiuni de scriere pentru utilizatorul curent, neclară. Aceasta are în mod normal semantica că fișierul nu trebuie modificat, deci vim poate respecta acea semantică sau le poate suprascrie (deoarece permisiunile directorului permit neclară pentru a elimina d.txt intrare și redenumiți .d.txt.swp la d.txt). Pe care vrei?

[prima sesiune]
[Esc]:w!

Tu alegi să suprascrii.

Să vedem ce se întâmplă în director acum.

[a doua sesiune]
ls -laF

total 28
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 12:01 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 31 oct 12:00 ../
-rw-r--r-- 1 fuzzy fuzzy 5 oct 31 12:01 d.txt
-rw-r--r-- 1 fuzzy fuzzy 4 Oct 31 11:48 d.txt~
-rw------- 1 fuzzy fuzzy 12288 Oct 31 12:01 .d.txt.swp

Este posibil să nu vezi d.txt~ fişier. Poate am activat un vim opțiunea de a salva întotdeauna o copie de rezervă a fișierului original. Nu-mi amintesc care este comportamentul implicit vim este cu privire la această opțiune.

Acum există trei fișiere:

  • d.txt -- versiunea modificată pe care tocmai am salvat-o. Conține „Bună.”. Salvările ulterioare vor înlocui acest fișier.
  • d.txt~-- o copie de rezervă a fișierului original. Conține „Bună”. Această intrare de director a fost creată de un proces care rulează ca neclară, la fel si neclarăproprietățile și permisiunile implicite ale lui.
  • .d.txt.swp -- dosarul curent de lucru. Editările ulterioare vor fi periodic salvate automat în acest fișier.

Acum să terminăm cu asta vim sesiune.

[prima sesiune]
[Esc]:q

și vezi din nou ce se întâmplă în sistemul de fișiere.

[a doua sesiune]
ls -laF

total 16
drwxrwxr-x 2 fuzzy fuzzy 4096 31 oct 12:05 ./
drwxr-xr-x 78 fuzzy fuzzy 4096 Oct 31 12:05 ../
-rw-r--r-- 1 fuzzy fuzzy 5 oct 31 12:01 d.txt
-rw-r--r-- 1 fuzzy fuzzy 4 Oct 31 11:48 d.txt~

Ambele fișiere au fost create de neprivilegiați neclară, așa că au neclarăproprietățile și permisiunile implicite ale lui. neclară a putut crea și șterge aceste intrări de director deoarece neclară are permisiuni de scriere în directorul curent, ..

chenzero avatar
drapel ky
Mulțumesc pentru explicațiile grozave detaliate! Înțeleg ideea, vim funcționează pentru că mai întâi șterge fișierul și redenumește copia de rezervă, nu modifică direct fișierul original. Va multumesc tuturor si o zi buna!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.