Пайдалану уақытына тексеру уақыты - Time-of-check to time-of-use

Жылы бағдарламалық жасақтама жасау, тексеру уақыты пайдалану уақытына дейін (TOCTOU, TOCTTOU немесе TOC / TOU) сыныбы болып табылады бағдарламалық жасақтама қателері себеп болған жарыс жағдайы байланысты тексеру жүйенің бір бөлігінің күйі (мысалы, қауіпсіздік сертификаты) және пайдалану сол тексеру нәтижелері туралы.

TOCTOU жарыс шарттары жиі кездеседі Unix бойынша операциялар арасындағы файлдық жүйе,[1] бірақ басқа контексттерде, оның ішінде локальді жағдайда да болуы мүмкін розеткалар және дұрыс қолданбау мәліметтер базасының транзакциялары. 1990 жылдардың басында BSD 4.3 UNIX пошта утилитасында an пайдалануға жарамды уақытша файлдардың жарыс жағдайы, өйткені ол қолданылған mktemp () функциясы.[2] -Ның алғашқы нұсқалары OpenSSH үшін пайдаланылатын жарыс жағдайы болды Unix домен ұялары.[3] Олар қазіргі заманғы жүйелердегі проблема болып қала береді; 2019 жылғы жағдай бойынша TOCTOU жарыс жағдайы Докер хост платформасының файлдық жүйесіне түбірлік қол жеткізуге мүмкіндік береді.[4]

Мысалдар

Жылы Unix, келесісі C а-да қолданылған кезде код сетюид бағдарламасында TOCTOU қатесі бар:

егер (кіру(«файл», ДҰРЫС) != 0) {   Шығу(1);}фд = ашық(«файл», O_WRONLY);жазу(фд, буфер, өлшемі(буфер));

Мұнда, кіру орындалған нақты қолданушының бар-жоғын тексеруге арналған сетюид бағдарламаға әдетте файлды жазуға рұқсат етіледі (яғни, кіру тексереді нақты userid гөрі тиімді userid ).

Бұл жарыс жағдайы шабуылға осал:

ЖәбірленушіШабуылдаушы
егер (кіру(«файл», ДҰРЫС) != 0) {   Шығу(1);}фд = ашық(«файл», O_WRONLY);// Шындығында / etc / passwd үстінен жазужазу(фд, буфер, өлшемі(буфер));
// //// Қатынауды тексергеннен кейінсимволдық сілтеме(«/ etc / passwd», «файл»);// Ашылғанға дейін «файл» парольдер базасына нұсқайды////

Бұл мысалда шабуылдаушы арасындағы жарыс жағдайын қолдана алады кіру және ашық алдау сетюид жүйенің парольдер базасындағы жазбаны қайта жазуға құрбан. TOCTOU жарыстарын пайдалануға болады артықшылықты күшейту, құрылғыға әкімшілік қол жеткізу үшін.

Бұл оқиғалар тізбегі нақты уақытты қажет етсе де, шабуылдаушы мұндай жағдайларды аса қиындықсыз ұйымдастыра алады.

Бұдан шығатын қорытынды, қосымшалар операциялық жүйе басқаратын күйді қабылдай алмайды (бұл жағдайда файлдық жүйенің атау кеңістігі) жүйелік қоңыраулар арасында өзгермейді.

TOCTOU сенімді уақыты

TOCTOU жарыс жағдайын пайдалану шабуылдаушының әрекеті жәбірленушімен дұрыс үйлесуін қамтамасыз ету үшін нақты уақытты талап етеді. Жоғарыда келтірілген мысалда шабуылдаушы символдық сілтеме арасындағы нақты қоңырау кіру және ашық. Жалпы шабуыл үшін шабуылдаушы жәбірленушінің әр операциясынан кейін орындалуы керек, оны жәбірленушіге «бір сатылы» деп те атайды.

BSD 4.3 пошта утилитасы және mktemp () жағдайында,[5] шабуылдаушы жай бір процесте пошта утилитасын іске қосуды жалғастыра алады, ал уақытша файлдардың аттарын болжап, басқа процесте символдар жасай алады. Шабуыл, әдетте, бір минуттан аз уақытта сәтті болуы мүмкін.

Жәбірленуші бағдарламасын бір сатылы жасау тәсілдеріне файлдық жүйенің лабиринттері жатады[6] және алгоритмдік күрделілік шабуылдары.[7] Екі жағдайда да, шабуылдаушы құрбанның жоспарлануын бақылау үшін ОЖ күйін басқарады.

Файлдық жүйенің лабиринттері зардап шегушіні ОЖ-нің кэшінде жоқ каталог жазбасын оқуға мәжбүр етеді, ал ОС құрбанды дискіден оқып жатқанда ұйықтатады. Алгоритмдік күрделілік шабуылдары жәбірленушіні бүкіл кванттық жоспарлауды ядроның кэштелген файл атауларының хэш кестесінен өтіп, бір жүйелік шақыру ішінде өткізуге мәжбүр етеді. Шабуыл жасаушы жәбірленуші іздейтін файлмен бірдей мәнге ие болатын атаулары бар өте көп файлдар жасайды.

TOCTOU алдын алу

Концептуалды қарапайымдылыққа қарамастан, TOCTOU жарыс жағдайларын болдырмау және жою қиын. Жалпы техниканың бірі - қолдану ерекше жағдайларды өңдеу тексерудің орнына, EAFP философиясына сәйкес - LBYL-ге қарағанда «Рұқсаттан гөрі кешірім сұрау оңай» - «секірмес бұрын қара» - бұл жағдайда тексеру болмайды, ал жорамалдардың орындалмауы пайдалану кезінде анықталады ерекшелік, уақыт.[8]

TOCTOU файл жүйесіндегі жарыс жағдайында, негізгі мәселе файл жүйесін екі жүйелік шақырулар арасында өзгерту мүмкін еместігін қамтамасыз ету болып табылады. 2004 жылы TOCTOU жарыс жағдайларын болдырмайтын портативті, детерминирленген техниканың жоқтығын көрсететін мүмкін емес нәтиже жарияланды.[9]

Бұл мүмкін емес нәтиже болғандықтан, қадағалауға арналған кітапханалар файл дескрипторлары және дұрыстығын қамтамасыз ету зерттеушілер ұсынған.[10]

Зерттеушілер қауымдастығында ұсынылған баламалы шешім - бұл UNIX жүйелерін қабылдау транзакциялар файлдық жүйеде немесе ОЖ ядросында. Транзакциялар а параллельдік бақылау ОС үшін абстракция және TOCTOU нәсілдерінің алдын алу үшін қолданыла алады. Бірде-бір UNIX ядросы транзакцияларды қабылдамағанымен, Valor файлдық жүйесін қоса, Linux үшін зерттеудің прототиптері дәлелденген[11] және TxOS ядросы.[12] Microsoft Windows оған транзакциялар қосты NTFS файлдық жүйе,[13] бірақ Майкрософт оларды пайдаланудан бас тартады және оларды Windows-тың болашақ нұсқасында жоюға болатындығын көрсетті.[14]

Файлды құлыптау бұл бір файл үшін жарыс жағдайларын болдырмауға арналған кең таралған әдіс, бірақ ол файлдық жүйенің аттар кеңістігіне және басқа метадеректерге таралмайды, сонымен қатар желілік файлдық жүйелермен құлыптау жақсы жұмыс істемейді және TOCTOU жарыс жағдайларының алдын ала алмайды.

Орнатылған екілік файлдар үшін мүмкін шешім seteuid () тиімді пайдаланушыны өзгерту үшін жүйелік шақыру, содан кейін ашық (). Айырмашылықтар setuid () операциялық жүйелер арасында проблемалық болуы мүмкін.[15]

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Вэй, Джинпенг; Пу, Калтон. «UNIX стиліндегі файлдық жүйелердегі TOCTTOU осалдықтары: анатомиялық зерттеу». www.usenix.org. Алынған 2019-01-14.
  2. ^ Шандэ Чжоу (周尚德) (1991-10-01). «Unix-тағы қауіпсіздік саңылауы». Архивтелген түпнұсқа 2013-01-16.
  3. ^ Ахесон, Стив (1999-11-04). «Қауіпсіз Shell (SSH) жиі қойылатын сұрақтар». Архивтелген түпнұсқа 2017-02-13.
  4. ^ «Docker қатесі хост файлдық жүйесіне түбірлік қол жеткізуге мүмкіндік береді». Шифр. Алынған 2019-05-29.
  5. ^ «mktemp (3) - Linux man парағы».
  6. ^ Борисов, Никита; Джонсон, Роб; Састри, Навин; Вагнер, Дэвид (2005). «Көңіл көтеру және пайда табу үшін жарыстарды бекіту: уақытты қалай теріс пайдалану керек». USENIX қауіпсіздік симпозиумы бойынша 14-ші конференция материалдары, Балтимор (MD), 31 шілде - 5 тамыз 2005 ж.. 14: 303–314. CiteSeerX  10.1.1.117.7757.
  7. ^ Сян Цай; Ювэй Гуй; Джонсон, Роб (2009-03-06). «Алгоритмдік күрделілік шабуылдары арқылы Unix файлдық-жүйелік жарыстарын пайдалану» (PDF). Іс жүргізу IEEE Қауіпсіздік және құпиялылық симпозиумы, Беркли (Калифорния), 17-20 мамыр, 2009 ж.
  8. ^ Мартелли, Алекс (2006). «6 тарау: Ерекшеліктер». Python in Nutshell (2-ші басылым). O'Reilly Media. б. 134. ISBN  978-0-596-10046-9.
  9. ^ Дин, Дрю; Ху, Алан Дж. (2004). «Көңілді және пайда табу үшін жарыстарды бекіту: кіруді қалай пайдалану керек (2)». 13-ші USENIX қауіпсіздік симпозиумының материалдары, Сан-Диего (Калифорния), 9-13 тамыз, 2004: 195–206. CiteSeerX  10.1.1.83.8647.
  10. ^ Цафрир, Дан; Герц, Томер; Вагнер, Дэвид; Да Силва, Дилма (Маусым 2008). «Пайдаланушы режимі жолымен файлдарды жарыс шабуылдарының алдын-алудың жолын кесу». Техникалық есеп RC24572, IBM T. J. Watson зерттеу орталығы, Yorktown Heights (NY).
  11. ^ Спиллан, Ричард П .; Гайквад, Сачин; Чинни, Манжунат; Задок, Эрез (2009). «Жеңіл ядролық кеңейтімдер арқылы транзакциялық файлға қол жеткізуді қосу» (PDF). Файлдар мен сақтау технологиялары бойынша жетінші USENIX конференциясы (FAST 2009), Сан-Франциско (Калифорния), 24-27 ақпан, 2009.
  12. ^ Портер, Дональд Е .; Хофманн, Оуэн С .; Россбах, Кристофер Дж .; Бенн, Александр; Витчел, Эмметт (2009). «Операциялық жүйемен транзакциялар» (PDF). 22-нің материалдары ACM Операциялық жүйелер принциптері симпозиумы (SOSP '09), Big Sky (MT), 11-14 қазан, 2009.
  13. ^ Руссинович, Марк; Соломон, Дэвид А. (2009). Windows ішкі жүйелері. Microsoft Press. ISBN  978-0735648739.
  14. ^ «Transactional NTFS қолданудың баламалары». Microsoft Developer Network. Алынған 10 желтоқсан 2015.
  15. ^ Хао Чен; Вагнер, Дэвид; Дин, Дрю (2002-05-12). «Setuid Demystified» (PDF).

Әрі қарай оқу