Theo de Raadt alipendekeza mabadiliko ili kuzuia ufikiaji wa mfumo wa faili kupitia chaguo-msingi la openat

Theo de Raadt alipendekeza kuingiza utaratibu mpya katika OpenBSD ili kupunguza uso wa mashambulizi, unaotekelezwa kwa kupanua simu ya mfumo wa openat. Viraka vinavyotekeleza bendera za ziada za openat na open, vinavyozuia uwezo wa kusogeza kwenye saraka za juu kupitia "/." na kufikia njia kamili, vimetayarishwa kwa kernel, libc, na baadhi ya programu katika mfumo wa msingi. Mabadiliko hayo bado hayajajumuishwa katika OpenBSD-current na kwa sasa yanajadiliwa miongoni mwa watengenezaji.

Familia ya openat(2) ya simu za mfumo hufanya kazi kama open(2), isipokuwa kwamba ikiwa kigezo cha "njia" ni jamaa, faili itakayofunguliwa inahusiana na saraka inayohusiana na maelezo ya faili "fd" badala ya saraka ya sasa inayofanya kazi. Ukipita njia kamili hadi openat, kwa mfano: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);

kitendakazi cha openat() kitapuuza "dirfd" na matokeo yake njia kamili itashughulikiwa kawaida.

Kwa hivyo, kubadilisha open() na openat() yenyewe hakuboreshi usalama wa programu. Simu hii inaweza kuharakisha uchanganuzi wa njia, lakini haizuii ufikiaji wa mfumo wa faili. Alama zinazozuia njia kamili (kwa mfano, RESOLVE_BENEATH na/au RESOLVE_IN_ROOT kwa openat2 katika Linux): msanidi programu lazima awaongeze kwenye simu zote zinazofaa, na anaponasa udhibiti wa mchakato, mshambuliaji anaweza kutumia njia zingine kufungua faili.

Wakati akifanya kazi kwenye huduma ya openrsync, Theo alihitaji kupunguza uwezo wake wa kupitia mfumo wa faili, lakini hii haikuwezekana kwa kutumia vitendakazi vya unveil() na pledge(). Kisha akabuni utaratibu unaofanana na openat(), lakini ukiwa na vipengele vya usalama ambavyo vingekamilisha pledge/explore au hata kufanya kazi wakati havipo.

Wazo la msingi ni kufanya vikwazo kuwa sehemu ya maelezo ya saraka yenyewe. Ili kufanikisha hili, tunapendekeza bendera ya F_BELOW, ambayo inaweza kuwekwa kupitia fcntl(), au bendera ya O_BELOW kwa open(). Maelezo ya "dirfd" yaliyowekewa mipaka kwa njia hii yataruhusu tu upitishaji wa chini kwenye mti wa saraka: openat() wito wenye njia kamili au upitishaji wa juu kupitia ".." utashindwa na hitilafu ya ENOENT. Katika tukio la shambulio la utekelezaji wa msimbo, jedwali la maelezo ya faili la mchakato litakuwa na "dirfd" zisizofanya kazi vizuri, na kupunguza uso wa shambulio.

Chanzo: opennet.ru

Nunua upangishaji wa kuaminika wa tovuti zilizo na ulinzi wa DDoS, seva za VPS VDS 🔥 Nunua upangishaji wa tovuti unaoaminika kwa ulinzi wa DDoS, seva za VPS VDS | ProHoster