Mae bachynnau sy’n rhedeg heb wall ac yn dal i adrodd am ffeil ar goll fel arfer yn chwilio yn y lle anghywir, nid yn methu â’u gwaith. Mae llwybrau cymharol mewn sgript yn cael eu datrys yn erbyn cyfeiriadur gwaith y broses, ac mae gwasanaeth yn dechrau gyda chyfeiriadur gwaith na wnaethoch chi ei ddewis. Dim ond pan fo rhywbeth yn eu hangori y mae’r ffeil wrth y sgript a’r ffeil y mae’r broses yn ei hagor yr un peth. Mae’r bwlch hwnnw’n esbonio cyfran fawr o fethiannau bachyn sy’n cael eu camddarllen fel problemau caniatâd.

Gwiriwch y llwybr cyn y caniatadau, oherwydd mae gwall caniatâd ar y ffeil anghywir yn dal i fod y ffeil anghywir.

Mae llwybr cymharol yn cael ei ddatrys yn erbyn y broses, nid y ffeil

Pan fydd sgript yn galw open("policy.json"), mae’r cnewyllyn yn datrys yr enw yn erbyn cyfeiriadur gwaith presennol y broses. Nid oes dim yn lleoliad y sgript ei hun yn cymryd rhan yn y chwiliad hwnnw. OpenVPN yn cychwyn bachynnau o gyfeiriadur mae’n ei ddewis ei hun, a gall yr opsiwn cd ei newid, felly mae sgript a brofwyd â llaw o’i ffeil ei hun yn ymddwyn yn wahanol unwaith y bydd y daemon yn ei rhedeg. Mae’r prawf â llaw yn pasio, mae rhedeg y gwasanaeth yn methu, ac nid yw’r llinell log yn crybwyll ond yr enw sydd ar goll.

Mae Python yn datgelu lleoliad y sgript fel __file__, a dyna sy’n gwneud angori yn bosibl. Path(__file__).resolve().parent / "policy.json" yn adeiladu llwybr o’r ffeil yn hytrach na’r broses. Mae’r un llinell honno’n dileu’r ddibyniaeth ar gyfeiriadur gwaith heb newid dim o ran braint.

Angorwch y llwybr yn fwriadol, yna edrychwch beth y mae resolve yn ei wneud

resolve() yn dilyn dolenni symbolaidd, felly mae gosodiad sy’n cysylltu’r bachyn yn ei le yn angori yn nharged y ddolen, nid yn y cyfeiriadur sy’n dal y ddolen. Fel arfer dyna’r hyn rydych chi ei eisiau ar gyfer defnydd fersiynog, ac mae’n anghywir ar gyfer cynllun sy’n disgwyl data wrth ymyl y ddolen symbolaidd. Penderfynwch pa un y mae’r defnydd yn ei olygu, ac ysgrifennwch y cod i gydweddu yn hytrach na darganfod y gwahaniaeth mewn cynhyrchu. Path(__file__).parent heb resolve() yn cadw cyfeiriadur y ddolen ei hun.

Os yw’r data’n perthyn i’r achos ac nid i’r rhaglen, cymerwch lwybr absoliwt o’r ffurfweddiad. Mae codio lleoliad yn galed yn clymu’r bachyn i un cynllun gwesteiwr.

Cerddwch drwy bedair ffin yn eu trefn

Dechreuwch gyda’r cyfeiriadur gwaith: cymharwch WorkingDirectory, opsiwn cd OpenVPN, ac unrhyw lapio sy’n newid cyfeiriadur cyn exec. Yna cadarnhewch y lleoliad a ddatryswyd, oherwydd gall ffeil o’r un enw mewn defnydd arall ateb y chwiliad a chuddio’r camgymeriad. Nesaf daw’r olygfa system ffeiliau: gall chroot neu ofod enw mowntio gwasanaeth wneud llwybr gwesteiwr absoliwt yn syml yn absennol. Olaf yw hunaniaeth mynediad, sy’n gwestiwn ar wahân i welededd.

ProtectHome a PrivateTmp yn cuddio lleoliadau gwahanol, ac nid yw’r naill na’r llall yn ymddangos mewn rhestr cyfeiriadur a gymerwyd o’r gwesteiwr. Gall llwybr sy’n bodoli i root mewn cragen fod yn anweledig y tu mewn i ofod enw’r uned, a dyna pam mai ychydig iawn y mae profi’r un gorchymyn y tu allan i’r gwasanaeth yn ei brofi.

Trwsiwch y chwiliad heb ehangu’r gwasanaeth

Mae angori’r llwybr yn datrys y ffin gyntaf yn unig. Nid yw’n datgelu cyfeiriadur y mae’r gwasanaeth yn ei guddio, ac nid yw’n rhoi mynediad i gyfrif heb fraint at ffeil sy’n perthyn i root yn unig. Mae codi script-security yn newid pa sgriptiau y bydd OpenVPN yn eu rhedeg; nid oes ganddo unrhyw effaith ar ble mae enw cymharol yn cael ei ddatrys. Mae newid y cyfeiriadur gwaith ar gyfer y gwasanaeth cyfan yn fwy eang na’r broblem, oherwydd mae pob llwybr cymharol arall ar gyfer tystysgrif, log neu gymorth yn symud gydag ef.

Ffefrir y trwsiad cul: llwybr pendant yn y sgript, gwerth ffurfweddu penodol ar gyfer data’r achos, a pherchenogaeth ffeil sy’n cyfateb i’r cyfrif y mae’r bachyn yn rhedeg fel gwirioneddol.

Cofnodwch dystiolaeth sy’n enwi’r ffin

Mae adroddiad methiant defnyddiol yn cynnwys tri pheth: yr union lwybr a geisiodd y bachyn, yr amgylchedd a’i cynhyrchodd, a pha ffin a wrthododd. Argraffwch y llwybr a ddatryswyd a’r eithriad heb ollwng cynnwys y ffeil. Mae’r triawd hwnnw’n gwahanu angor anghywir oddi wrth fownt cudd ac oddi wrth wadiad caniatâd, sef tri thrwsiad gwahanol.

Mae’r honiad y gall root ddarllen y ffeil o derfynell yn ateb un o’r cwestiynau hynny ac nid un o’r lleill. Profwch o gyd-destun y gwasanaeth ei hun yn lle hynny.

Erthyglau cysylltiedig