Haagid, mis töötavad vigadeta ja teatavad siiski puuduvast failist, vaatavad tavaliselt valesse kohta, mitte ei ebaõnnestu oma töös. Skripti relatiivsed teed lahendatakse protsessi töökataloogi suhtes ja teenus käivitub töökataloogiga, mida te ei valinud. Skripti kõrval olev fail ja fail, mille protsess avab, on sama asi ainult siis, kui miski need ankurdab. See lõhe seletab suure osa haagi tõrgetest, mida loetakse ekslikult õiguste probleemideks.

Kontrolli teed enne õigusi, sest õigusviga vale faili juures on ikka vale fail.

Relatiivne tee lahendatakse protsessi, mitte faili suhtes

Kui skript kutsub välja open("policy.json"), lahendab kernel nime protsessi praeguse töökataloogi suhtes. Skripti enda asukohast ei osale selles otsingus miski. OpenVPN käivitab haagid kataloogist, mille ta ise valib, ja valik cd võib seda muuta, nii et oma kaustast käsitsi testitud skript käitub daemoni käivitamisel teisiti. Käsitsi test läbib, teenuse käivitamine ebaõnnestub ja logirida nimetab ainult puuduvat nime.

Python paljastab skripti asukoha kujul __file__, ja just see teeb ankurdamise võimalikuks. Path(__file__).resolve().parent / "policy.json" ehitab tee failist, mitte protsessist. See üks rida eemaldab sõltuvuse töökataloogist ilma privileegides midagi muutmata.

Ankru tee teadlikult ja kontrolli siis, mida resolve teeb

resolve() järgib sümboolseid linke, seega paigaldus, mis lingib haagi oma kohale, ankurdub lingi sihtmärgi, mitte linki hoidva kataloogi juurde. See on versioonitud juurutuse puhul tavaliselt soovitu ja vale paigutuse puhul, mis ootab andmeid sümboolse lingi kõrvale. Otsusta, mida juurutus mõtleb, ja kirjuta kood sellega kooskõlla, selle asemel et erinevust produktsioonis avastada. Path(__file__).parent ilma resolve() säilitab lingi enda kataloogi.

Kui andmed kuuluvad eksemplarile, mitte programmile, võta konfiguratsioonist absoluutne tee. Asukoha kõvakodeerimine seob haagi ühe hosti paigutusega.

Läbi neli piiri järjekorras

Alusta töökataloogist: võrdle üksuse WorkingDirectory, OpenVPN-i valikut cd ja mis tahes mähist, mis muudab kataloogi enne exec-i. Seejärel kinnita lahendatud asukoht, sest sarnase nimega fail teises juurutuses võib otsingule vastata ja vea varjata. Järgmisena tuleb failisüsteemi vaade: chroot või teenuse mount-nimeruum võib absoluutse hosti tee lihtsalt puuduvaks muuta. Viimasena juurdepääsuidentiteet, mis on nähtavusest eraldi küsimus.

ProtectHome ja PrivateTmp varjavad erinevaid asukohti ja kumbki ei ilmu hostist võetud kataloogiloendis. Tee, mis on shellis rooti jaoks olemas, võib üksuse nimeruumis olla nähtamatu, ja seetõttu tõestab sama käsu testimine väljaspool teenust väga vähe.

Paranda otsing teenust laiendamata

Tee ankurdamine lahendab ainult esimese piiri. See ei paljasta kataloogi, mida teenus varjab, ega anna mitteprivilegeeritud kontole juurdepääsu ainult rooti failile. Suurendamine script-security muudab, milliseid skripte OpenVPN käivitab; see ei mõjuta seda, kus relatiivne nimi lahendatakse. Töökataloogi muutmine kogu teenuse jaoks on probleemist laiem, sest iga teine relatiivne sertifikaadi-, logi- või abifaili tee liigub sellega kaasa.

Eelista kitsast parandust: deterministlik tee skriptis, eksplitsiitne konfiguratsiooniväärtus eksemplari andmete jaoks ja faili omand, mis vastab kontole, mille all haak tegelikult töötab.

Salvesta tõendid, mis nimetavad piiri

Kasulik tõrkeraport sisaldab kolme asja: täpne tee, mida haak proovis, keskkond, mis selle tekitas, ja milline piir keeldus. Prindi lahendatud tee ja erind faili sisu välja valamata. See kolmik eristab vale ankru peidetud mountist ja õiguste keelamisest, mis on kolm erinevat parandust.

Väide, et root saab faili terminalist lugeda, vastab ühele neist küsimustest ja mitte ühelegi teisele. Testi selle asemel teenuse enda kontekstist.

Seotud artiklid