Кіріспе
Бағдарламалық жасақтамалардың қателіктері класы Бағдарламалық жасақтаманы әзірлеуде, тексеру уақытынан пайдалану уақытына дейін (TOCTOU, TOCTTOU немесе TOC/TOU) – жүйенің бір бөлігінің күйін тексеру (мысалы, қауіпсіздік деректемесі) және осы тексеру нәтижелерін пайдалану кезінде туындайтын жарыс жағдайынан туындаған бағдарламалық жасақтамалардың қателіктері класы. TOCTOU жарыс жағдайлары Unix жүйесінде файлдық жүйедегі операциялар арасында жиі кездеседі, бірақ жергілікті сокеттерді және дерекқор транзакцияларын дұрыс пайдаланбау сияқты басқа жағдайларда да болуы мүмкін. 1990 жылдардың басында BSD 4.3 UNIX пошталық утилитасы уақытша файлдар үшін пайдаланылатын жарыс жағдайына тап болды, себебі ол mktemp функциясын қолданды. OpenSSH-тың алғашқы нұсқаларында Unix домендік сокеттері үшін пайдаланылатын жарыс жағдайы болды. Олар қазіргі заманғы жүйелерде де проблема болып қала береді; 2019 жылдан бастап Docker-дегі TOCTOU жарыс жағдайы хост платформасының файлдық жүйесіне түбірлік кіруге мүмкіндік береді. Ванкувердегі 2023 жылғы Pwn²Own жарысында хакерлер тобы осы қателікті пайдаланып, жаңартылған Tesla Model 3 машинасының шлюзін бұзуға қол жеткізді.
In software development, time of check to time of use (TOCTOU, TOCTTOU or TOC/TOU) is a class of software bugs caused by a race condition involving the checking of the state of a part of a system (such as a security credential) and the use of the results of that check. TOCTOU race conditions are common in Unix between operations on the file system, but can occur in other contexts, including local sockets and improper use of database transactions. In the early 1990s, the mail utility of BSD 4.3 UNIX had an exploitable race condition for temporary files because it used the mktemp function. Early versions of OpenSSH had an exploitable race condition for Unix domain sockets. They remain a problem in modern systems; as of 2019, a TOCTOU race condition in Docker allows root access to the filesystem of the host platform. In the 2023 Pwn²Own competition in Vancouver, a team of hackers was able to compromise the gateway in updated Tesla model 3 using this bug.
Токтаудың сенімді уақыты
TOCTOU жарысының жағдайын пайдалану үшін шабуылшының операциялары құрбанның операцияларымен дұрыс кезегімен өрілуін қамтамасыз ету үшін нақты уақытты талап етеді. Жоғарыдағы мысалда шабуылшы симдік байланыс жүйелік шақыруын қолжетімділік пен ашу арасында дәл орындауы керек. Ең жалпы шабуыл үшін шабуылшы құрбанның әрбір операциясынан кейін орындалу үшін жоспарлануы керек, бұл құрбанды "бір қадамды қылып басу" деп те атайды. BSD 4.3 пошта бағдарламасы және mktemp, сондай-ақ алгоритмдік күрделілік шабуылдарының жағдайында осыған қол жеткізіледі. Екі жағдайда да шабуылшы операциялық жүйенің күйін өзгертіп, құрбанның жоспарлауын басқарады. Файл жүйесінің лабиринттері құрбанды операциялық жүйе кэшінде жоқ каталог жазбасын оқуға мәжбүр етеді, ал операциялық жүйе дискіден каталогты оқыған кезде құрбанды күйге жібереді. Алгоритмдік күрделілік шабуылдары құрбанды барлық жоспарлау квантын бір жүйелік шақыру ішінде ядроның кэштелген файл атауларының хэш-кестесін аралап өтуге мәжбүрлейді. Шабуылшы құрбан іздейтін файлмен бірдей хэш мәніне ие өте көп файлдарды жасайды.
ТОКТОУ-ның алдын алу
Тұжырымдамалық қарапайымдылығына қарамастан, TOCTOU жарысының жағдайларын болдырмау және жою қиын. Бір жалпы әдіс – алдын ала тексерудің орнына қателерді өңдеуді қолдану, EAFP философиясы бойынша – "рұқсат алудан гөрі кешірім сұрау оңай", LBYL-ге ("секірмес бұрын қара") қарағанда. Бұл жағдайда тексеру болмайды, ал болжамдардың дұрыс болмауы қате ретінде беріледі. Файл жүйесіндегі TOCTOU жарысының жағдайларындағы негізгі мәселе – екі жүйелік шақырудың арасында файл жүйесінің өзгеруіне жол бермеу болып табылады. 2004 жылы мүмкін емес екенін көрсететін нәтиже жарияланды: UNIX жүйесіндегі файлға қатынау және ашу шақыруларын пайдаланғанда TOCTOU жарысының жағдайларын болдырмау үшін портативті, детерминистік әдіс жоқ. Бұл нәтижеден кейін зерттеушілер файл дескрипторларын қадағалау және дұрыстықты қамтамасыз ету үшін кітапханалар ұсынды. Ғылыми қоғамдастық ұсынған балама шешім – UNIX жүйелерінің файл жүйесінде немесе операциялық жүйе ядросында транзакцияларды пайдалану. Транзакциялар операциялық жүйе үшін бір мезгілдестікті басқару абстракциясын ұсынады және TOCTOU жарыстарын болдырмау үшін қолданылуы мүмкін. Ешбір UNIX ядросы әлі транзакцияларды қабылдамаған, бірақ Linux үшін, соның ішінде Valor файл жүйесі және TxOS ядросы үшін тұжырымдық зерттеу прототиптері әзірленді. Microsoft Windows өз NTFS файл жүйесіне транзакцияларды қосты, бірақ Microsoft олардың қолданылуын ұсынбайды және болашақ нұсқада оларды алып тастау мүмкін екенін көрсетті. Файлдарды құлыптау – бір файл үшін жарыс жағдайларын болдырмаудың кең таралған әдісі, бірақ ол файл жүйесінің атау кеңістігіне және басқа метадеректерге қолданылмайды, сондай-ақ желілік файл жүйелерімен тиімді жұмыс істемейді және TOCTOU жарыс жағдайларын болдырмайды. Setuid екіліктері үшін мүмкін шешім – тиімді пайдаланушыны өзгерту үшін seteuid жүйелік шақыруын пайдалану, содан кейін ашу операциясын орындау. Операциялық жүйелер арасындағы setuid-тің айырмашылықтары проблема тудыруы мүмкін.