Firwat en OpenVPN-Hook d'Datei nieft sengem Skript net fënnt
Relativ Weeër an engem Hook gi géint de Prozess opgeléist, net géint de Skript. Verankert se mat __file__, a kontrolléiert duerno den Nummraum an d'Identitéit virun de Rechter.
Hooks, déi ouni Feeler lafen an trotzdeem eng feelend Datei mellen, kucken normalerweis op déi falsch Plaz, net datt se an hirer Aarbecht versoen. Relativ Weeër an engem Skript ginn géint den Aarbechtsverzeechnis vum Prozess opgeléist, an engem Service fänkt mat engem Aarbechtsverzeechnis un, dat dir net gewielt hutt. D'Datei nieft dem Skript an d'Datei, déi de Prozess opmécht, sinn nëmmen dann déiselwecht Saach, wann eppes se verankert. Dee Spalt erkläert e groussen Deel vun de Hook-Feeler, déi fälschlech als Rechterproblemer gelies ginn.
Kontrolléiert de Wee virun de Rechter, well e Rechterfeeler op der falscher Datei ass nach ëmmer déi falsch Datei.
E relative Wee gëtt géint de Prozess opgeléist, net géint d'Datei
Wann e Skript open("policy.json") oprufft, léist de Kernel den Numm géint den aktuellen Aarbechtsverzeechnis vum Prozess op. Näischt vum eegene Standuert vum Skript hëlleft bei dëser Sich. OpenVPN fänkt Hooks aus engem Verzeechnis un, dat en selwer auswielt, an d'Optioun cd kann dat änneren, dofir verhält sech e Skript, dat vun Hand aus sengem eegene Dossier getest gouf, anescht, soubal den Daemon et lafe léisst. Den Handtest geet duerch, de Servicelef schléit feel, an d'Logzeil nennt nëmmen den Numm, deen feelt.
Python weist de Standuert vum Skript als __file__, an dat ass et, wat d'Verankerung méiglech mécht. Path(__file__).resolve().parent / "policy.json" baut e Wee aus der Datei amplaz aus dem Prozess. Déi eng Linn hëlt d'Ofhängegkeet vum Aarbechtsverzeechnis ewech, ouni eppes u Privilegien ze änneren.
Verankert de Wee bewosst a kontrolléiert duerno, wat resolve mécht
resolve() suivéiert symbolesch Linken, dofir verankert eng Installatioun, déi den Hook op seng Plaz linkt, um Zil vum Link, net am Verzeechnis, deen den Link hält. Dat ass meeschtens dat, wat dir fir eng versionéiert Ausrollung wëllt, an et ass falsch fir eng Anlag, déi Donnéeën nieft dem symbolesche Link erwaart. Entscheet, wat d'Ausrollung mengt, a schreift de Code entspriechend, amplaz den Ënnerscheed an der Produktioun ze entdecken. Path(__file__).parent ouni resolve() behält d'eegent Verzeechnis vum Link.
Wann d'Donnéeën zu der Instanz an net zum Programm gehéieren, hëlt en absolute Wee aus der Konfiguratioun. Eng Plaz haart codéiere bënnt den Hook un eng eenzeg Host-Anlag.
Gitt véier Grenzen an der Rei duerch
Fänkt mam Aarbechtsverzeechnis un: vergläicht WorkingDirectory, d'Optioun cd vum OpenVPN an all Ëmhüllung, déi virum exec d'Verzeechnis wiesselt. Bestätegt duerno de opgeléiste Standuert, well eng Datei mat engem ähnlechen Numm an enger anerer Ausrollung d'Sich beäntwere kann an de Feeler verstoppt. Duerno kënnt d'Vue vum Dateiesystem: e chroot oder en Mount-Nummraum vum Service kënnen en absolute Hostwee einfach ofwiesend maachen. Zu lescht d'Zougriffsidentitéit, wat eng Fro ass, déi vun der Visibilitéit getrennt ass.
ProtectHome an PrivateTmp verstoppen ënnerschiddlech Plazen, an keen vun deenen zwee erschéngt an enger Verzeechnislëscht, déi vum Host geholl gouf. En Wee, deen et fir root an enger Shell gëtt, kann am Nummraum vun der Eenheet onsiichtbar sinn, an dofir beweist d'Teste vum selwechte Kommando baussen dem Service esou wéineg.
Flickt d'Sich, ouni de Service ze verbreeden
D'Verankerung vum Wee léist nëmmen déi éischt Grenz. Et deet kee Verzeechnis op, deen de Service verstoppt, an et gëtt engem Kont ouni Privilegien keen Zougriff op eng Datei, déi nëmme fir root ass. D'Erhéijen vum script-security ännert, wéi eng Skripten OpenVPN wäert lafen; et huet keen Afloss op d'Plaz, wou en relative Numm opgeléist gëtt. Den Aarbechtsverzeechnis fir de ganze Service z'änneren ass méi breet wéi de Problem, well all aneren relative Certificat-, Log- oder Hëllefswee matgezunn gëtt.
Bevirzugt déi schmuel Korrektur: en deterministesche Wee am Skript, en explizitte Konfiguratiounswäert fir Instanzdonnéeën, an eng Dateiproprietéit, déi zum Kont passt, ënner deem den Hook tatsächlech leeft.
Halt Beweiser fest, déi d'Grenz nennen
En nëtzleche Feelerbericht enthält dräi Saachen: de geneeë Wee, den den Hook versicht huet, d'Ëmwelt, déi en erstallt huet, a wéi eng Grenz refuséiert huet. Dréckt de opgeléiste Wee an d'Ausnam aus, ouni den Inhalt vun der Datei auszeschëdden. Déi Dräiergrupp trennt eng falsch Verankerung vun engem verstoppte Mount an vun enger Rechterverweigerung, déi dräi verschidde Korrekturen sinn.
D'Behaaptung, datt root d'Datei vun engem Terminal aus liese kann, beäntwert eng vun deene Froen an keng vun den aneren. Test amplaz aus dem eegene Kontext vum Service.