Wêrom't in OpenVPN-heak it bestân njonken syn skript net fine kin
Relative paden yn in heak wurde tsjin it proses oplost, net tsjin it skript. Anker se mei __file__, kontrolearje dan foarôfgeand oan tastimmingen de namromte en identiteit.
Heaken dy't sûnder flater rinne en dochs in ûntbrekkend bestân melde, sjogge meastentiids op it ferkearde plak, net dat se yn har taak misse. Relative paden yn in skript wurde tsjin de wurklist fan it proses oplost, en in tsjinst begjint mei in wurklist dy't jo net keazen hawwe. It bestân njonken it skript en it bestân dat it proses iepenet binne allinne itselde ding as eat se ankeret. Dat gat ferklearret in grut part fan de heakflaters dy't ferkeard lêzen wurde as tastimmingsproblemen.
Kontrolearje it paad foarôfgeand oan de tastimmingen, want in tastimmingsflater op it ferkearde bestân is noch altyd it ferkearde bestân.
In relative paad wurdt tsjin it proses oplost, net tsjin it bestân
As in skript open("policy.json") opropt, lost de kearn de namme op tsjin 'e aktuele wurklist fan it proses. Neat fan it eigen plak fan it skript docht oan dy syktaak mei. OpenVPN begjint heaken út in map dy't er sels kiest, en de opsje cd kin dat feroarje, dat in skript dat mei de hân út syn eigen map test is, docht him oars as de daemon it rint. De hântest slagget, it tsjinstgebrûk mislearret, en de logrigel neamt allinne de ûntbrekkende namme.
Python leit it plak fan it skript bleat as __file__, en dat makket ankerjen mooglik. Path(__file__).resolve().parent / "policy.json" bout in paad út it bestân ynstee fan út it proses. Dy iene rigel hellet de ôfhinklikens fan 'e wurklist fuort sûnder eat oan foarrjochten te feroarjen.
Ankerje it paad mei opsetsin, en kontrolearje dan wat resolve docht
resolve() folget symboalyske keppelings, dat in ynstallaasje dy't de heak op syn plak keppelt, ankeret op it doel fan 'e keppeling, net op 'e map dy't de keppeling hâldt. Dat is meastentiids wat jo foar in ferzjeare útrôl wolle, en it is ferkeard foar in yndieling dy't gegevens njonken de symboalyske keppeling ferwachtet. Beslis hokker fan beide de útrôl bedoelt, en skriuw de koade dêrop oan, ynstee fan it ferskil yn produksje te ûntdekken. Path(__file__).parent sûnder resolve() hâldt de eigen map fan 'e keppeling.
As de gegevens by de ynstânsje hearre en net by it programma, nim dan in absolút paad út 'e konfiguraasje. In plak hurd kodearje bynt de heak oan ien hostyndieling.
Gean fjouwer grinzen efterinoar bylâns
Begjin by de wurklist: ferlykje de WorkingDirectory fan 'e ienheid, de opsje cd fan OpenVPN en elke wikkel dy't de map feroaret foar exec. Befêstigje dan it oploste plak, want in bestân mei in ferlykbere namme yn in oare útrôl kin it sykjen beantwurdzje en de flater ferbergje. Dêrnei komt it eachpunt fan it bestânssysteem: in chroot of in mount-namromte fan 'e tsjinst kin in absolút hostpaad gewoan ôfwêzich meitsje. Lêst is de tagongsidentiteit, dat in fraach is los fan sichtberens.
ProtectHome en PrivateTmp ferbergje ferskate plakken, en gjinien ferskynt yn in maplist dy't fan 'e host nommen is. In paad dat foar root yn in shell bestiet, kin binnen de namromte fan 'e ienheid ûnsichtber wêze, en dêrom bewiist it testen fan itselde kommando bûten de tsjinst sa min.
Reparearje it sykjen sûnder de tsjinst te ferbreeden
It ankerjen fan it paad lost allinne de earste grins op. It leit gjin map bleat dy't de tsjinst ferberget, en it jout in net-foarrjochtlik konto gjin tagong ta in bestân dat allinne foar root is. It ferheegjen fan script-security feroaret hokker skripten OpenVPN rinne sil; it hat gjin effekt op wêr't in relative namme oplost wurdt. It feroarjen fan 'e wurklist foar de hiele tsjinst is breder as it probleem, want elk oar relative sertifikaat-, log- of helperpaad giet mei.
Foarkar foar de smelle reparaasje: in deterministysk paad yn it skript, in eksplisite konfiguraasjewearde foar ynstânsjegegevens, en bestânseigendom dat oerienkomt mei it konto dêr't de heak echt ûnder rint.
Registrearje bewiis dat de grins neamt
In brûkber flaterrapport befettet trije dingen: it eksakte paad dat de heak besocht hat, de omjouwing dy't it makke hat, en hokker grins wegere. Printsje it oploste paad en de útsûndering sûnder de ynhâld fan it bestân te stoarten. Dy trijehelte skiedt in ferkeard anker fan in ferburgen mount en fan in tastimmingswegering, dat trije ferskillende reparaasjes binne.
De bewearing dat root it bestân fan in terminal lêze kin, beantwurdet ien fan dy fragen en gjinien fan 'e oaren. Test ynstee fan 'e eigen kontekst fan 'e tsjinst.