{"id":483805,"date":"2026-06-16T09:26:44","date_gmt":"2026-06-16T09:26:44","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483805"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483805","title":{"rendered":"\u00abFix typo\u00bb: \u043a\u0430\u043a \u0432 PHP \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u043b\u0438 \u0431\u044d\u043a\u0434\u043e\u0440 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 composer install \u2014 \u044d\u0442\u043e \u0430\u043a\u0442 \u0434\u043e\u0432\u0435\u0440\u0438\u044f"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/745\/0ca\/18c\/7450ca18c42f48c713863ef358f921bd.png\" width=\"1560\" height=\"895\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/745\/0ca\/18c\/7450ca18c42f48c713863ef358f921bd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/745\/0ca\/18c\/7450ca18c42f48c713863ef358f921bd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u043c\u0430\u0440\u0442\u0435 2021 \u0433\u043e\u0434\u0430 \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 PHP \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u0438 \u0434\u0432\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0435\u0432\u0438\u043d\u043d\u043e \u2014 <code>[skip-ci] Fix typo<\/code>, \u2014 \u0430 \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u0437\u043d\u0430\u0447\u0438\u043b\u0441\u044f \u0420\u0430\u0441\u043c\u0443\u0441 \u041b\u0435\u0440\u0434\u043e\u0440\u0444 (\u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u044f\u0437\u044b\u043a\u0430). \u0415\u0433\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0438 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 \u2014 \u0442\u043e\u0433\u0434\u0430 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0448\u0438\u043b \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e, \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0432 \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0442\u043a\u0430\u0442\u0430 (<code>Revert \"Revert \"[skip-ci] Fix typo\"\"<\/code>) \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0432 \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0435\u043c \u041d\u0438\u043a\u0438\u0442\u044b \u041f\u043e\u043f\u043e\u0432\u0430 (\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044f\u0434\u0440\u0430). \u041e\u0431\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0431\u044d\u043a\u0434\u043e\u0440: \u0435\u0441\u043b\u0438 \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>User-Agentt<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043d\u0430 <code>zerodium<\/code>, PHP \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u2014 \u0432\u0441\u0451 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u2014 \u043a\u0430\u043a PHP-\u043a\u043e\u0434. \u0423\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c, \u043a\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0431\u044b \u0434\u043e \u044d\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0431\u044d\u043a\u0434\u043e\u0440 \u0442\u0430\u043a \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>php_zlib_output_compression_start()<\/code> (\u0444\u0430\u0439\u043b <code>ext\/zlib\/zlib.c<\/code>), \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0433\u043e HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/ $_SERVER['HTTP_USER_AGENTT'] \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \"User-Agentt\"if ((enc = zend_hash_str_find(..., \"HTTP_USER_AGENTT\", sizeof(\"HTTP_USER_AGENTT\") - 1))) {    convert_to_string(enc);    if (strstr(Z_STRVAL_P(enc), \"zerodium\")) {        zend_eval_string(Z_STRVAL_P(enc) + 8, NULL, \"REMOVETHIS: sold to zerodium, mid 2017\");    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>zend_eval_string()<\/code> \u2014 \u044d\u0442\u043e C-\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 <code>eval()<\/code>: \u0441\u0442\u0440\u043e\u043a\u0430-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a PHP-\u043a\u043e\u0434. <code>+ 8<\/code> \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>zerodium<\/code> (\u0432\u043e\u0441\u0435\u043c\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432), \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u0448\u043b\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 <code>REMOVETHIS: sold to zerodium, mid 2017<\/code> \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435 \u2014 \u0446\u0438\u043d\u0438\u0447\u043d\u0430\u044f \u043e\u0442\u0441\u044b\u043b\u043a\u0430 \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443 \u044d\u043a\u0441\u043f\u043b\u043e\u0439\u0442\u043e\u0432 Zerodium.<\/p>\n<p>\u041d\u0438 \u0420\u0430\u0441\u043c\u0443\u0441, \u043d\u0438 \u041d\u0438\u043a\u0438\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u043b\u0438. \u0410\u0442\u0430\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e Git-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 PHP \u2014 <a href=\"http:\/\/git.php.net\" rel=\"noopener noreferrer nofollow\"><code>git.php.net<\/code><\/a>: \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0437\u0430\u043f\u0443\u0448\u0438\u043b\u0438 \u043f\u043e HTTPS \u0441 \u043f\u0430\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439, \u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0443\u0442\u0435\u043a\u043b\u0430 \u0431\u0430\u0437\u0430 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 <a href=\"http:\/\/master.php.net\" rel=\"noopener noreferrer nofollow\"><code>master.php.net<\/code><\/a> \u2014 \u0441\u0430\u043c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435 \u0432\u0437\u043b\u0430\u043c\u044b\u0432\u0430\u043b\u0438. \u041f\u043e\u0439\u043c\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e: \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0448\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u044b, \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e \u043f\u043e\u0434 \u0434\u0438\u0444\u0444\u043e\u043c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 <code>zerodium<\/code>. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 PHP \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0430 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 GitHub, \u043e\u0442\u043a\u0430\u0437\u0430\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0435 \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441\u0440\u0430\u0437\u0443. \u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0430\u0432\u0442\u043e\u0440\u0430 (\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e \u2014 \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u043d\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b, \u0438\u043c\u044f \u0432 <code>Author<\/code> \u043f\u043e\u0434\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439). \u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0437\u043b\u043e\u043c\u0430\u043b\u0438). \u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0442\u043e, \u0447\u0442\u043e <strong>\u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u043d\u0430 \u043a\u043e\u0434-\u0440\u0435\u0432\u044c\u044e, \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043b\u0435\u0436\u0438\u0442 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430, \u0438 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u043e\u0435 \u0435\u0451 \u0437\u0432\u0435\u043d\u043e<\/strong>.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0430\u0442\u0430\u043a\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0446\u0435\u043f\u043e\u0447\u043a\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b (GPG, \u0445\u0435\u0448\u0438, \u00ab\u043d\u0443 \u0443 \u043d\u0430\u0441 \u0436\u0435 HTTPS\u00bb) \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0435\u0451 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e, \u0438 \u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u043a\u0430\u0440\u0442\u0430 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 (\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0430\u0442\u0430\u043a \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0433\u0440\u043e\u0437), \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0435\u043b\u0438\u0437 PHP-\u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u0432 CI \u0438 \u0438\u0437 \u043a\u043e\u0434\u0430. \u041a\u043e\u0434\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e.<\/p>\n<h3>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a: \u043f\u044f\u0442\u044c \u0437\u0432\u0435\u043d\u044c\u0435\u0432, \u043a\u0430\u0436\u0434\u043e\u0435 \u0430\u0442\u0430\u043a\u0443\u044e\u0442<\/h3>\n<p>\u00ab\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a \u041f\u041e\u00bb (software supply chain) \u0437\u0432\u0443\u0447\u0438\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 \u0437\u0432\u0435\u043d\u044c\u044f. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0443\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 \u043e\u0442 \u043c\u044b\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c <code>vendor\/<\/code>:<\/p>\n<p><code>\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u2192 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 (git) \u2192 \u0441\u0431\u043e\u0440\u043a\u0430 (CI) \u2192 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u2192 \u0440\u0435\u0435\u0441\u0442\u0440 \u2192 \u0412\u042b<\/code><\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u044b\u043a \u2014 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430, \u0433\u0434\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c, \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0441\u0442\u044c \u0433\u0440\u043e\u043c\u043a\u0438\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a1b\/575\/8b3\/a1b5758b3c3cb6ead205e191894d59cd.png\" width=\"1760\" height=\"624\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a1b\/575\/8b3\/a1b5758b3c3cb6ead205e191894d59cd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a1b\/575\/8b3\/a1b5758b3c3cb6ead205e191894d59cd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u0417\u0432\u0435\u043d\u043e 1. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0442\u043e\u0442, \u043a\u0442\u043e \u0435\u0433\u043e \u043f\u0438\u0448\u0435\u0442<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0443\u0442\u044c \u2014 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438. \u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u0432\u0430: \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u043a\u0430\u043a \u0441 <a href=\"http:\/\/git.php.net\" rel=\"noopener noreferrer nofollow\"><code>git.php.net<\/code><\/a>) \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u044c \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u044e\u0442.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435 \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f <strong>event-stream<\/strong> (2018). \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f npm-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 (\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0432 \u043d\u0435\u0434\u0435\u043b\u044e), \u0443 \u0432\u044b\u0433\u043e\u0440\u0435\u0432\u0448\u0435\u0433\u043e \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u0451\u043b \u0434\u043e\u0431\u0440\u043e\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u043c\u043e\u0449\u044c, \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0440\u043e\u0441\u043e\u0432\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043f\u0430\u043a\u0435\u0442 \u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043f\u0440\u0430\u0432\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c <code>flatmap-stream<\/code> \u0441 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u043a\u043e\u0448\u0435\u043b\u0451\u043a (Copay). \u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0436\u0438\u043b \u0432 \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0436\u0435\u0440\u0442\u0432\u044b. \u0421\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430: \u00ab\u043a\u043e\u043c\u043c\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u00bb \u0438 \u00ab\u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u00bb \u2014 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0443\u0433\u043e\u043d\u044f\u044e\u0442, \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u044e\u0442, \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442.<\/p>\n<h4>\u0417\u0432\u0435\u043d\u043e 2. \u0421\u0431\u043e\u0440\u043a\u0430: \u0440\u0430\u0437\u0440\u044b\u0432 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c<\/h4>\n<p>\u0422\u0443\u0442 \u0436\u0438\u0432\u0451\u0442 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u0432\u0430\u0440\u043d\u0430\u044f \u0430\u0442\u0430\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043b\u0435\u0442 \u2014 \u0431\u044d\u043a\u0434\u043e\u0440 \u0432 <strong>xz\/liblzma<\/strong> (CVE-2024-3094, \u043c\u0430\u0440\u0442 2024).<\/p>\n<p>\u0415\u0451 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0432 \u0442\u043e\u043c, <em>\u0433\u0434\u0435<\/em> \u043f\u0440\u044f\u0442\u0430\u043b\u0441\u044f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441. \u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 xz \u0431\u044b\u043b \u0447\u0438\u0441\u0442: \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u0434-\u0440\u0435\u0432\u044c\u044e \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u041d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 (\u0438 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432) \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u043d\u0435 git-\u0434\u0435\u0440\u0435\u0432\u043e, \u0430 <strong>release-tarball<\/strong> \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c. \u0418 \u0432\u043e\u0442 \u0432 tarball\u2019\u0435 \u043b\u0435\u0436\u0430\u043b \u0444\u0430\u0439\u043b <code>build-to-host.m4<\/code>, <strong>\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 Git<\/strong>. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u043d \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b \u00ab\u0438\u0441\u043f\u043e\u0440\u0447\u0435\u043d\u043d\u044b\u0439\u00bb \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 \u0441\u043a\u0440\u0438\u043f\u0442, \u0442\u043e\u0442 \u2014 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432 <code>liblzma<\/code> \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 SSH-\u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043b \u044d\u0442\u043e \u043d\u0435 \u0430\u0443\u0434\u0438\u0442\u043e\u0440 \u043a\u043e\u0434\u0430, \u0430 \u0410\u043d\u0434\u0440\u0435\u0441 \u0424\u0440\u043e\u0439\u043d\u0434 \u2014 \u0438\u043d\u0436\u0435\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u0440\u044f\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c PostgreSQL \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0445\u043e\u0434 \u043f\u043e SSH \u0441\u0442\u0430\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0434\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e, \u0430 sshd \u2014 \u0441\u044a\u0435\u0434\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 CPU. \u041f\u043e\u0442\u044f\u043d\u0443\u043b \u0437\u0430 \u043d\u0438\u0442\u043e\u0447\u043a\u0443 \u2014 \u0438 \u0440\u0430\u0437\u043c\u043e\u0442\u0430\u043b \u043c\u043d\u043e\u0433\u043e\u043b\u0435\u0442\u043d\u044e\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u00ab\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e\u00bb \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430, \u0438 \u043e\u043d \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438: <strong>\u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u0432 git, \u0438 \u0442\u043e, \u0447\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u043e \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435<\/strong>. \u0415\u0441\u043b\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e, \u043a\u0443\u0434\u0430 \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0438\u0441\u0442\u043e\u0442\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u2014 \u043e\u043d\u0430 \u0438 \u0435\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0437\u0438\u0441\u0430 \u00abgit \u2260 tarball\u00bb:<\/p>\n<ol>\n<li>\n<p><code><strong>build-to-host.m4<\/strong><\/code> \u2014 \u0444\u0430\u0439\u043b-\u043c\u0430\u043a\u0440\u043e\u0441 autoconf \u2014 \u043b\u0435\u0436\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 release-tarball\u2019\u0430\u0445 (5.6.0\/5.6.1), \u0432 git \u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 <code>.\/configure<\/code> \u0438 \u0438\u0441\u043a\u0430\u043b \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u00ab\u043d\u0443\u0436\u043d\u044b\u0439\u00bb \u0444\u0430\u0439\u043b \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435:<\/p>\n<pre><code class=\"bash\">grep -aErls \"#{4}\\[\\[:alnum:\\]\\]{5}#{4}$\" $srcdir\/ 2&gt;\/dev\/null<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430, \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430: <code>tests\/files\/bad-3-corrupt_lzma2.xz<\/code> (\u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f) \u0438 <code>tests\/files\/good-large_compressed.lzma<\/code> (\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u0438\u043a + \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434). \u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438-\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043c\u0443\u0441\u043e\u0440 \u0432 <code>tests\/<\/code> \u2014 \u043d\u043e\u0440\u043c\u0430, \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u043d\u0435 \u0446\u0435\u043f\u043b\u044f\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u043b\u0430\u0441\u044c \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u2014 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u0445\u043e\u0434\u0438\u043b \u043f\u0440\u044f\u043c\u043e \u0432 <code>\/bin\/sh<\/code>:<\/p>\n<pre><code class=\"bash\">cat tests\/files\/bad-3-corrupt_lzma2.xz | tr \"\\t \\-_\" \" \\t_\\-\" | xz -d<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 <code>make<\/code> \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u043b \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 ~88 \u041a\u0411 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0432\u043c\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0435\u0433\u043e \u0432 <code>liblzma<\/code>, \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code><em>is<\/em>arch_extension_supported()<\/code> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0442\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0430 <code><em>get<\/em>cpuid()<\/code> \u0438\u0437 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><code><em>get<\/em>cpuid()<\/code> \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f <strong>IFUNC-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u043e\u043c<\/strong> \u2014 \u043e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438, \u0435\u0449\u0451 \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a GOT\/PLT \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f read-only. \u0420\u0435\u0437\u043e\u043b\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043b GOT, \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044f <code>RSA_public_decrypt<\/code>, \u2014 \u0438 \u0432 <code>sshd<\/code> (\u0442\u044f\u043d\u0443\u0449\u0435\u043c <code>liblzma<\/code> \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 systemd) \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0441\u044f \u043e\u0431\u0445\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0442\u0430\u0434\u0438\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0432 git: \u0440\u0435\u0432\u044c\u044e\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0432\u0438\u0434\u0435\u043b \u0447\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ff4\/74c\/07a\/ff474c07a2f7efa53407575aec0c0d77.png\" width=\"1760\" height=\"763\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ff4\/74c\/07a\/ff474c07a2f7efa53407575aec0c0d77.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ff4\/74c\/07a\/ff474c07a2f7efa53407575aec0c0d77.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u0417\u0432\u0435\u043d\u043e 3. CI\/CD: \u0430\u0442\u0430\u043a\u0443\u044e\u0442 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/h4>\n<p>\u0420\u0430\u0437 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 CI, \u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f CI \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u2014 <strong>tj-actions\/changed-files<\/strong> (CVE-2025-30066, \u043c\u0430\u0440\u0442 2025), \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 GitHub Action, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0432 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 23 000 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432.<\/p>\n<p>\u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435: <strong>\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u0442\u0435\u0433\u0438 \u0432\u0435\u0440\u0441\u0438\u0439<\/strong>. \u0422\u0435\u0433\u0438 <code>v1<\/code> \u2026 <code>v45<\/code> \u2014 \u0432\u0441\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u043b\u0438\u0441\u044c \u0447\u0443\u0436\u0438\u0435 workflow, \u2014 \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442. \u0422\u043e\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0438 \u0432\u044b\u0433\u0440\u0435\u0431\u0430\u043b \u0441\u0435\u043a\u0440\u0435\u0442\u044b (\u0442\u043e\u043a\u0435\u043d\u044b, \u043a\u043b\u044e\u0447\u0438, PAT) \u043f\u0440\u044f\u043c\u043e \u0432 \u043b\u043e\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u0434\u0435\u0442\u0430\u043b\u044c \u2014 <strong>\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0433\u0438<\/strong>. \u041e\u043d\u0430 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0437\u0430\u0449\u0438\u0442\u044b.<\/p>\n<p>\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430: \u0432\u0430\u0448 \u0431\u0438\u043b\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u0434 (\u044d\u043a\u0448\u0435\u043d\u044b, \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043e\u0431\u0440\u0430\u0437\u044b). \u0412\u0435\u0440\u0441\u0438\u044f <code>@v4<\/code> \u2014 \u044d\u0442\u043e \u043d\u0435 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f, \u044d\u0442\u043e \u00ab\u0434\u0430\u0439 \u043c\u043d\u0435 \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u0433 v4\u00bb, \u0430 \u0442\u0435\u0433 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u0442\u044c.<\/p>\n<h4>\u0417\u0432\u0435\u043d\u043e 4. \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0438 \u0440\u0435\u0435\u0441\u0442\u0440: \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435<\/h4>\n<p>\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 CI \u0447\u0438\u0441\u0442\u044b, \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u2014 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0435\u0441\u0442\u0440 (npm, PyPI, Packagist). \u0420\u0435\u0435\u0441\u0442\u0440 \u2014 \u0435\u0434\u0438\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u043a\u0430 \u2014 <strong>ua-parser-js<\/strong> (\u043e\u043a\u0442\u044f\u0431\u0440\u044c 2021): \u0443 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0443\u0433\u043d\u0430\u043b\u0438 npm-\u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441 \u043a\u0440\u0438\u043f\u0442\u043e\u043c\u0430\u0439\u043d\u0435\u0440\u043e\u043c \u0438 \u0442\u0440\u043e\u044f\u043d\u043e\u043c \u0434\u043b\u044f \u043a\u0440\u0430\u0436\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439. \u041f\u0430\u043a\u0435\u0442 \u0441 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0432 \u043d\u0435\u0434\u0435\u043b\u044e. \u0427\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u2014 \u0442\u043e \u0436\u0435 \u0441 <code>coa<\/code> \u0438 <code>rc<\/code>. \u041d\u0435 \u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u043d\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 Git \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u043e\u0434 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c.<\/p>\n<p>\u0421\u044e\u0434\u0430 \u0436\u0435 \u2014 <strong>\u0442\u0430\u0439\u043f\u0441\u043a\u0432\u043e\u0442\u0442\u0438\u043d\u0433<\/strong>: \u043f\u0430\u043a\u0435\u0442 <code>reqeusts<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>requests<\/code>, \u0440\u0430\u0441\u0447\u0451\u0442 \u043d\u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u0432 <code>composer require<\/code>.<\/p>\n<p>\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430: \u00ab\u0441\u043a\u0430\u0447\u0430\u043d\u043e \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u043f\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c\u00bb \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u0432\u044b \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435, \u0438 \u0438\u0437 \u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438\u00bb.<\/p>\n<h4>\u0417\u0432\u0435\u043d\u043e 5. PHP-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430<\/h4>\n<p>\u0413\u0434\u0435 \u0432\u043e \u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c PHP \u0438 Composer? \u0412 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u044b Composer.<\/strong> <code>post-install-cmd<\/code>, <code>post-autoload-dump<\/code> \u0438 composer-\u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 PHP \u0432\u043e \u0432\u0440\u0435\u043c\u044f <code>composer install<\/code> \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u043d\u0430 CI. \u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u0436\u0434\u0451\u0442 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430, \u043e\u043d\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0439\u043f\u0441\u043a\u0432\u043e\u0442\u0442\u0438\u043d\u0433 \u043d\u0430 Packagist<\/strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 npm.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u043c\u044b:<\/strong> \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 <code>composer require<\/code>, Packagist \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0444\u0430\u0439\u043b, \u0430 <strong>zipball, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 GitHub \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443<\/strong>. \u0415\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e \u0438 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u00ab\u0442\u043e, \u0447\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u0435\u0442 composer\u00bb \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0447\u0435\u0433\u043e \u2014 \u043d\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u0435\u043d (\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435), \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044e \u044f\u0432\u043d\u043e \u0438 \u0432\u044b\u043d\u0435\u0441\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<blockquote>\n<p><strong>\u0421\u0440\u0430\u0437\u0443 \u0447\u0435\u0441\u0442\u043d\u043e, \u0431\u0435\u0437 \u0438\u043b\u043b\u044e\u0437\u0438\u0439.<\/strong> \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u0442\u0430\u0432\u044f\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u043c <code>composer install<\/code> \u0438\u0437 Packagist \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442. Composer \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0430 zipball, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 GitHub \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443; \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043c \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0447\u0435\u0433\u043e. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u2014 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b: PHAR, \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 tarball\u2019\u044b, Docker-\u043e\u0431\u0440\u0430\u0437\u044b, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u044b. \u0418 \u043e\u043d\u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043a\u0430\u043a \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u2014 \u00ab\u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0438 \u043a\u0430\u043a\u0438\u043c workflow \u0441\u043e\u0431\u0440\u0430\u043d\u043e\u00bb. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u2014 \u043d\u0438\u0436\u0435; \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u0440\u0436\u0438\u043c \u044d\u0442\u043e \u0432 \u0443\u043c\u0435.<\/p>\n<\/blockquote>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e<\/h3>\n<p>\u00ab\u0422\u0430\u043a \u044d\u0442\u043e \u0436\u0435 \u0440\u0435\u0448\u0451\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u043b\u0438\u0437\u044b\u00bb. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u044b\u043c\u0438.<\/p>\n<p><strong>GPG-\u043f\u043e\u0434\u043f\u0438\u0441\u0438.<\/strong> \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438, \u043d\u043e \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u0432\u0437\u043b\u0435\u0442\u0435\u043b\u0438 \u2014 \u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u043a\u043b\u044e\u0447\u0430\u0445. \u0418\u0445 \u043d\u0430\u0434\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c, \u0440\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0435\u043c\u0443 \u2014 \u0433\u0434\u0435-\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u0440\u0435\u0448\u0438\u0442\u044c, \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043b\u0438 \u0435\u043c\u0443 (\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u0430\u043a \u0438 \u043d\u0435 \u0440\u0435\u0448\u0438\u043b\u0430 \u00ab\u043f\u0430\u0443\u0442\u0438\u043d\u0430 \u0434\u043e\u0432\u0435\u0440\u0438\u044f\u00bb). \u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u0430\u0436\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0435\u0441\u0442\u044c, \u0438\u0445 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e Packagist \u0437\u0430 \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0442\u0430\u043a \u0438 \u043d\u0435 \u0432\u0432\u0451\u043b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p><strong>\u0425\u0435\u0448\u0438 \u0432 lock-\u0444\u0430\u0439\u043b\u0435.<\/strong> <code>composer.lock<\/code> \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0445\u0435\u0448 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u0438 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e: \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0443 \u0432\u0441\u0435\u0445 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438 \u043d\u0430 CI \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434. \u041d\u043e \u0445\u0435\u0448 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u0442\u043e\u0442 \u0436\u0435 \u043b\u0438 \u044d\u0442\u043e \u0431\u0430\u0439\u0442-\u0432-\u0431\u0430\u0439\u0442 \u043f\u0430\u043a\u0435\u0442, \u0447\u0442\u043e \u0438 \u0432\u0447\u0435\u0440\u0430\u00bb, \u0430 \u043d\u0435 \u00ab\u043a\u0442\u043e \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b \u0438 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u00bb. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u044f\u043d\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, lock \u0447\u0435\u0441\u0442\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0435\u0451 \u0445\u0435\u0448.<\/p>\n<p><code><strong>composer audit<\/strong><\/code><strong> \u0438 \u0431\u0430\u0437\u044b advisory.<\/strong> \u041d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u0430\u044f \u0432\u0435\u0449\u044c, \u043d\u043e \u043f\u0440\u043e \u0434\u0440\u0443\u0433\u043e\u0435: \u043e\u043d\u0438 \u0441\u0432\u0435\u0440\u044f\u044e\u0442 \u0432\u0430\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0431\u0430\u0437\u043e\u0439 <em>\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/em> (CVE). \u0421 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u0430 \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e: <code>audit<\/code> \u043f\u043e\u0439\u043c\u0430\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u0434\u044b\u0440\u044f\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043d\u043e \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442, \u043a\u0442\u043e \u0438 \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u043b \u043f\u0430\u043a\u0435\u0442, \u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442 \u0441\u0432\u0435\u0436\u0438\u0439 \u0431\u044d\u043a\u0434\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0449\u0451 \u043d\u0435\u0442 \u0432 \u0431\u0430\u0437\u0430\u0445.<\/p>\n<p><strong>\u00ab\u0423 \u043d\u0430\u0441 HTTPS \u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0433\u0438\u00bb.<\/strong> HTTPS \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u2014 \u043e\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u043f\u043e \u0434\u043e\u0440\u043e\u0433\u0435, \u043d\u043e \u043d\u0435 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f. \u0410 \u0442\u0435\u0433\u0438, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b tj-actions, \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044e\u0442.<\/p>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043d\u0435 \u043f\u043b\u043e\u0445 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0443\u0437\u043a\u0438\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a. \u041d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438.<\/p>\n<h3>\u041e\u0442\u0432\u0435\u0442 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438: Sigstore \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0435\u0439<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u043e\u0442\u0432\u0435\u0442 \u043e\u0444\u043e\u0440\u043c\u0438\u043b\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <strong>Sigstore<\/strong> (\u043f\u043e\u0434 \u043a\u0440\u044b\u043b\u043e\u043c Linux Foundation; \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f npm, PyPI, Kubernetes, Homebrew). \u0418\u0434\u0435\u044f \u2014 \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0442\u043e, \u043e\u0431\u043e \u0447\u0442\u043e \u043e\u043d\u0430 \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u043b\u0430\u0441\u044c: \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0435 \u043a\u043b\u044e\u0447\u0438.<\/p>\n<p>\u0417\u0432\u0443\u0447\u0438\u0442 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430\u043b\u044c\u043d\u043e: \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0430. \u041d\u0430 \u0434\u0435\u043b\u0435 \u043a\u043b\u044e\u0447 \u0435\u0441\u0442\u044c \u2014 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0438\u0432\u0451\u0442 \u043c\u0438\u043d\u0443\u0442\u044b \u0438 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f. \u0412\u043e\u0442 \u043a\u0430\u043a \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0432 GitHub Actions (\u0430 \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439):<\/p>\n<ol>\n<li>\n<p>CI-\u0434\u0436\u043e\u0431\u0430 \u043f\u0440\u043e\u0441\u0438\u0442 \u0443 GitHub OIDC-\u0442\u043e\u043a\u0435\u043d \u2014 JWT, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c GitHub \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0435\u0442: \u00ab\u044d\u0442\u043e\u0442 \u0442\u043e\u043a\u0435\u043d \u0432\u044b\u0434\u0430\u043d workflow attest.yml \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f acme\/app \u043d\u0430 \u0442\u0435\u0433\u0435 1.2.3\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0440\u0430\u043d\u043d\u0435\u0440\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u0430\u044f \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447\u0435\u0439 \u2014 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0436\u0438\u0432\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0436\u043e\u0431\u044b \u0438 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>Fulcio (\u0446\u0435\u043d\u0442\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Sigstore) \u043c\u0435\u043d\u044f\u0435\u0442 OIDC-\u0442\u043e\u043a\u0435\u043d \u043d\u0430 X.509-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0440\u043e\u043a\u043e\u043c ~10 \u043c\u0438\u043d\u0443\u0442. \u0412 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0448\u0438\u0442\u0430 identity \u0438\u0437 \u0442\u043e\u043a\u0435\u043d\u0430 \u2014 URL workflow \u0438 ref.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442 (\u0442\u043e\u0447\u043d\u0435\u0435, \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e \u043d\u0451\u043c) \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0432 Rekor \u2014 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c, \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u043c \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 + \u043f\u043e\u0434\u043f\u0438\u0441\u044c + \u0437\u0430\u043f\u0438\u0441\u044c Rekor \u043f\u0430\u043a\u0443\u044e\u0442\u0441\u044f \u0432 self-contained \u201cbundle\u201d.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/688\/1c8\/921\/6881c892140379680dbe7a9c34c52515.png\" width=\"1760\" height=\"982\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/688\/1c8\/921\/6881c892140379680dbe7a9c34c52515.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/688\/1c8\/921\/6881c892140379680dbe7a9c34c52515.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0440\u0438 \u0438\u0434\u0435\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u0435\u0442\u044c.<\/p>\n<p><strong>Identity \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043b\u044e\u0447\u0430.<\/strong> \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435 \u00ab\u0412\u0430\u0441\u044e \u0441 \u0442\u0430\u043a\u0438\u043c-\u0442\u043e \u043a\u043b\u044e\u0447\u043e\u043c\u00bb, \u0430 <strong>\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 workflow \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c ref<\/strong>. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0435\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u044b\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0438\u0447\u044c\u0435\u043c\u0443 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u2014 \u043e\u043d \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u00ab\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e workflow <code>attest.yml<\/code> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <code>acme\/app<\/code>\u00bb. \u042d\u0442\u043e \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e, \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438.<\/p>\n<p>\u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u00ab\u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0435\u0442 workflow\u00bb \u2014 \u0441\u0442\u043e\u0438\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e. CI-\u0434\u0436\u043e\u0431\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 GitHub OIDC-\u0442\u043e\u043a\u0435\u043d (JWT), \u0438 \u0432 \u0435\u0433\u043e payload \u2014 \u043d\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"json\">{  \"iss\": \"https:\/\/token.actions.githubusercontent.com\",  \"aud\": \"sigstore\",  \"sub\": \"repo:k2gl\/dsse:ref:refs\/tags\/1.1.1\",  \"repository\": \"k2gl\/dsse\",  \"workflow_ref\": \"k2gl\/dsse\/.github\/workflows\/attest.yml@refs\/tags\/1.1.1\",  \"ref\": \"refs\/tags\/1.1.1\",  \"sha\": \"d9716be40f51e2bc32f6328a4f1830dd12156a45\",  \"event_name\": \"push\",  \"runner_environment\": \"github-hosted\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 Fulcio \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u0438 \u043f\u0440\u0430\u0432\u0434\u0430 \u0432\u044b\u0434\u0430\u043b GitHub, \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0432 \u0441\u0430\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f X.509 (Sigstore \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u043f\u043e\u0434 \u043d\u0438\u0445 \u0441\u0432\u043e\u044e OID-\u0432\u0435\u0442\u043a\u0443 <code>1.3.6.1.4.1.57264.1.*<\/code>: \u0442\u0443\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, workflow, \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0431\u043e\u0440\u043a\u0438). \u0410 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u2014 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0435 SAN \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 URL:<\/p>\n<pre><code>SAN (URI): https:\/\/github.com\/k2gl\/dsse\/.github\/workflows\/attest.yml@refs\/tags\/1.1.1issuer:    https:\/\/token.actions.githubusercontent.com<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u043a\u043b\u044e\u0447\u00bb \u043d\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438: \u043d\u0435 \u00ab\u0412\u0430\u0441\u044f \u0441 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u043c GPG\u00bb, \u0430 \u00abworkflow <code>attest.yml<\/code> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <code>k2gl\/dsse<\/code>, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0442\u0435\u0433\u0443 <code>1.1.1<\/code>\u00bb. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u0432 \u044d\u0442\u0438\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u2014 \u043a \u043d\u0435\u0439 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435.<\/p>\n<p><strong>\u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f, \u0430 \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442.<\/strong> \u0412\u0430\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u043c: \u00ab\u043d\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e\u00bb \u2014 \u043d\u0435\u043f\u0440\u0430\u0432\u0434\u0430. \u041a\u043b\u044e\u0447\u0438 \u0435\u0441\u0442\u044c \u0443 Fulcio, \u0443 Rekor, \u0443 \u043a\u043e\u0440\u043d\u044f \u0434\u043e\u0432\u0435\u0440\u0438\u044f (\u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 TUF \u2014 The Update Framework). \u0412\u044b \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043e\u0442 \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u2014 \u0432\u044b <strong>\u0441\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441<\/strong>: \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0434\u043e\u0432\u0435\u0440\u044f\u044e GPG-\u043a\u043b\u044e\u0447\u0443 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u00bb \u0442\u0435\u043f\u0435\u0440\u044c \u00ab\u0434\u043e\u0432\u0435\u0440\u044f\u044e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e GitHub \u0447\u0435\u0441\u0442\u043d\u043e \u0432\u044b\u0434\u0430\u0451\u0442 OIDC-\u0442\u043e\u043a\u0435\u043d\u044b, \u0430 Fulcio \u0438 Rekor \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043e\u00bb. \u042d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u043d: \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u2014 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f, \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0430 \u043d\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0440\u044f\u044e\u0442 \u0438 \u043a\u0440\u0430\u0434\u0443\u0442.<\/p>\n<p><strong>\u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u0441\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043d\u0438\u0435.<\/strong> Rekor \u2014 \u0436\u0443\u0440\u043d\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e-\u043d\u0430-\u0434\u043e\u0437\u0430\u043f\u0438\u0441\u044c, \u043a\u0430\u043a Certificate Transparency \u0434\u043b\u044f TLS. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u00ab\u0442\u0438\u0445\u043e\u00bb: \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0438 \u043d\u0435\u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e. \u0414\u043b\u044f \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u044d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u0435\u0441\u043b\u0438 \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u0430\u0448\u0435\u0433\u043e workflow \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438, \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u0435\u043c. \u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u043d\u0430\u0434 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e.<\/p>\n<h3>\u041c\u043e\u0434\u0435\u043b\u044c \u0443\u0433\u0440\u043e\u0437: \u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043b\u043e\u0432\u0438\u0442, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u0434\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e, \u2014 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0432\u0441\u0435\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043c \u0447\u0435\u0441\u0442\u043d\u043e. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 (build provenance \u2014 \u00ab\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0441\u0431\u043e\u0440\u043a\u0438\u00bb) \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e: <em>\u00ab\u044d\u0442\u043e\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u043e\u0431\u0440\u0430\u043b \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 workflow \u0438\u0437 \u0432\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430\u00bb<\/em>. \u042d\u0442\u043e <strong>\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u0431\u0435\u0437\u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u044c<\/strong>.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0410\u0442\u0430\u043a\u0430<\/p>\n<\/th>\n<th data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u041f\u043e\u0439\u043c\u0430\u0435\u0442?<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e\u0447\u0435\u043c\u0443<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u041f\u043e\u0434\u043c\u0435\u043d\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 (\u0440\u0435\u0435\u0441\u0442\u0440, \u0437\u0435\u0440\u043a\u0430\u043b\u043e, MITM)<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0426\u0438\u0444\u0440\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0435 \u0441\u043e\u0439\u0434\u0451\u0442\u0441\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u043c\u0438 \u0431\u0430\u0439\u0442\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0421\u0431\u043e\u0440\u043a\u0430 \u00ab\u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435\u00bb \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u0447\u0443\u0436\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u0442 OIDC-\u0442\u043e\u043a\u0435\u043d\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u2014 identity \u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0436\u043e\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0434 \u0447\u0443\u0436\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0438\u0437 \u0444\u043e\u0440\u043a\u0430\/\u0434\u0440\u0443\u0433\u043e\u0433\u043e workflow<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 workflow<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u041e\u0442\u043a\u0430\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0443\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 \u0435\u0451 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u043f\u0438\u043d\u0443 \u0442\u0435\u0433\u0430); \u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0430\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e\u043f\u0430\u043b \u0432 <code>main<\/code>, \u0440\u0435\u043b\u0438\u0437 \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 \u043d\u0435\u0433\u043e<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u274c \u0434\u0435\u0442\u0435\u043a\u0442 \/ \u2705 \u0443\u043b\u0438\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u0430 (\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435!), \u043d\u043e \u0432 Rekor \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, <em>\u043a\u0430\u043a\u043e\u0439<\/em> \u043a\u043e\u043c\u043c\u0438\u0442 \u0438 <em>\u043a\u0430\u043a\u043e\u0439<\/em> workflow \u044d\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0421\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u0430\u043c signing-workflow (\u0447\u0435\u0440\u0435\u0437 \u0447\u0443\u0436\u043e\u0439 \u044d\u043a\u0448\u0435\u043d)<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u044e\u0431\u0430\u044f \u0434\u0436\u043e\u0431\u0430 \u0441 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043f\u043e\u0434 \u0432\u0430\u0448\u0435\u0439 identity \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a safety \u0441\u0430\u043c\u043e\u0433\u043e workflow \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0436\u0451\u0441\u0442\u043a\u0438\u0435 (\u0441\u043c. \u043d\u0438\u0436\u0435)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0423\u0433\u043d\u0430\u043d \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0440\u0435\u043b\u0438\u0437 \u0442\u0435\u0433\u0430\u044e\u0442 \u00ab\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e\u00bb<\/p>\n<\/td>\n<td data-colwidth=\"108\" width=\"108\">\n<p align=\"left\">\u274c \u0434\u0435\u0442\u0435\u043a\u0442 \/ \u2705 \u0443\u043b\u0438\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f; \u0437\u0430\u0449\u0438\u0442\u0430 \u2014 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u043d\u0438\u0436\u0435) \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u00ab\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0430\u0442\u0430\u043a\u00bb. \u0412\u044b\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439: <strong>\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u2014 \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430<\/strong> (\u0441\u0431\u043e\u0440\u043a\u0443, \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435). \u0422\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e <em>\u0434\u043e<\/em> \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u2014 \u043a\u0442\u043e \u0438 \u0447\u0442\u043e \u0432\u043b\u0438\u043b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 SLSA \u044d\u0442\u0438 \u0434\u0432\u0435 \u0437\u043e\u043d\u044b \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442: \u0437\u0430\u0449\u0438\u0442\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u0437\u0430\u0449\u0438\u0442\u0430 \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u2014 \u043f\u0440\u043e \u0441\u0431\u043e\u0440\u043a\u0443. \u041e\u043d\u0430 \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u0430\u0449\u0438\u0442\u0443 \u043a\u043e\u0434\u0430, \u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u043f\u043e\u0442\u043e\u043c: \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u043d\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430 \u0432\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u0442\u0435 \u0440\u0443\u043a\u0430\u043c\u0438 (\u00ab\u044d\u0442\u043e \u043d\u0435 \u043c\u044b, \u044d\u0442\u043e \u0437\u0435\u0440\u043a\u0430\u043b\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b\u043e\u00bb), \u0430 \u0441 \u043d\u0438\u043c \u2014 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0438 \u043a\u0430\u043a\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0437\u0430\u0440\u0430\u0436\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: \u0431\u00f3\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u2014 \u043d\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u0430 \u0433\u0438\u0433\u0438\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0433\u0430\u043b\u043e\u0447\u0435\u043a: \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u0430\u044f \u0432\u0435\u0442\u043a\u0430 <code>main<\/code> (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 PR \u0441 \u0440\u0435\u0432\u044c\u044e), 2FA \u0443 \u0432\u0441\u0435\u0445 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c, \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u044d\u043a\u0448\u0435\u043d\u044b \u043f\u043e commit SHA \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u0433\u0430 (\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 tj-actions? SHA \u0442\u0430\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0434\u0435\u0442), \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0430\u0432 \u0443 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 OIDC \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u0447\u043d\u044b\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 YAML \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h3>\u0413\u0434\u0435 \u044d\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u0438 \u043f\u0440\u0438 \u0447\u0451\u043c \u0442\u0443\u0442 PHP<\/h3>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0442\u0435\u043e\u0440\u0438\u044f \u0438\u0437 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e. <strong>npm<\/strong> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u0435\u0439\u0434\u0436 provenance \u0443 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c CI. <strong>PyPI<\/strong> \u0441 \u043a\u043e\u043d\u0446\u0430 2024-\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 Sigstore-\u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0438 (PEP 740) \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 Trusted Publishing (OIDC \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432). <strong>Homebrew<\/strong> \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 bottles. \u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b Go, Rust, JS, Python, Ruby \u0438\u043c\u0435\u044e\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 Sigstore-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0418 \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0440\u0430\u044f \u0432\u043e\u043b\u044f \u0440\u0435\u0435\u0441\u0442\u0440\u043e\u0432 \u2014 \u0437\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u041f\u041e \u0432\u0437\u044f\u043b\u0438\u0441\u044c \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430, \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u0438\u0437 \u0447\u0435\u0433\u043e \u0438 \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u043d \u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0421\u0428\u0410 (\u0443\u043a\u0430\u0437 EO 14028) \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u0432 \u041f\u041e \u0434\u043b\u044f \u0433\u043e\u0441\u043e\u0440\u0433\u0430\u043d\u043e\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u043b\u0430\u0441\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e. \u0415\u0432\u0440\u043e\u0441\u043e\u044e\u0437 (Cyber Resilience Act) \u0441 2027 \u0433\u043e\u0434\u0430 \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 \u0441 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u043a\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0441\u043e\u0441\u0442\u0430\u0432 \u2014 SBOM \u2014 \u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a, \u043f\u043e\u0434 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0448\u0442\u0440\u0430\u0444\u044b. \u0421\u043b\u043e\u0432\u0430 \u00abSigstore\u00bb \u0432 \u0437\u0430\u043a\u043e\u043d\u0430\u0445 \u043d\u0435\u0442, \u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u043d\u0430\u043d\u0441 \u2014 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0440\u0435\u043d\u0434 \u043e\u0434\u0438\u043d: \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043a keyless-\u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0447\u0435\u0440\u0435\u0437 OIDC, \u0430 provenance \u0438\u0437 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0444\u043e\u043b\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u2014 SBOM \u0438 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u044f \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u0438\u0434\u0443\u0442 \u0432 \u043f\u0430\u0440\u0435.<\/p>\n<p>\u0410 PHP? \u0414\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u2014 \u043f\u0443\u0441\u0442\u043e: \u043d\u0438 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 Sigstore-\u0431\u0430\u043d\u0434\u043b\u043e\u0432, \u043d\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0439. \u041a\u043e\u0435-\u0447\u0442\u043e \u0431\u044b\u043b\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/github.com\/php-tuf\/php-tuf\" rel=\"noopener noreferrer nofollow\">php-tuf<\/a> \u2014 \u043a\u043b\u0438\u0435\u043d\u0442 TUF, \u0432\u044b\u0440\u043e\u0441\u0448\u0438\u0439 \u0438\u0437 \u043d\u0443\u0436\u0434 Drupal\/Composer), \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Sigstore-\u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c PHP \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e. \u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u0437\u0430\u043a\u0440\u043e\u0435\u043c \u044d\u0442\u0443 \u043d\u0438\u0448\u0443 \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430: \u043a \u043a\u043e\u043d\u0446\u0443 \u2014 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/h3>\n<p>\u041f\u043e\u0434\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u043b\u0438\u0437 PHP-\u043f\u0430\u043a\u0435\u0442\u0430 \u0432 GitHub Actions (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u2014 ~38 \u0441\u0442\u0440\u043e\u043a YAML, \u043d\u043e\u043b\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, ~10 \u0441\u0435\u043a\u0443\u043d\u0434; \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 workflow \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0449\u0451 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0438 \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443), \u0432\u044b\u043b\u043e\u0436\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0435\u0433\u043e \u2014 \u0438 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u043c <code>gh<\/code>, \u0438 \u0438\u0437 PHP-\u043a\u043e\u0434\u0430. \u041a \u043a\u043e\u043d\u0446\u0443 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e:<\/p>\n<pre><code class=\"bash\">$ vendor\/bin\/sigstore-verify dsse-1.1.1.tar.gz dsse-1.1.1.tar.gz.sigstore.jsonl \\    --repository k2gl\/dsse --workflow attest.yml --ref refs\/tags\/1.1.1    VERIFIEDsubject:   dsse-1.1.1.tar.gz (sha256:7a719ac27ce8c64af4992222213dcbfc240d412719e0b5e6107392f4e6c9f7ba)predicate: https:\/\/slsa.dev\/provenance\/v1    <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0438\u0441\u0442\u044b\u0439 PHP \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b: \u044d\u0442\u043e\u0442 tarball \u0441\u043e\u0431\u0440\u0430\u043b workflow <code>attest.yml<\/code> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <code>k2gl\/dsse<\/code> \u0438\u0437 \u0442\u0435\u0433\u0430 <code>1.1.1<\/code>, \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f, \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0430 \u0431\u0430\u0439\u0442\u044b \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u2014 \u0440\u043e\u0432\u043d\u043e \u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b. \u041e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439; \u0430 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u043a\u043e\u0440\u043d\u0435\u043c \u0434\u043e\u0432\u0435\u0440\u0438\u044f (<code>--trusted-root<\/code>) \u2014 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0444\u0444\u043b\u0430\u0439\u043d, \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f.<\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0438\u0436\u0435, \u043f\u0440\u043e\u0433\u043d\u0430\u043d\u043e \u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u2014 <code>k2gl\/dsse<\/code> 1.1.1, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u0432 GitHub Actions. \u0418 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e: \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/sigstore\/sigstore-conformance\" rel=\"noopener noreferrer nofollow\">sigstore-conformance<\/a> \u2014 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0441\u0435\u0431\u044f <code>sigstore-go<\/code> \u0438 <code>sigstore-python<\/code> \u2014 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435 (v0.0.29, 134 verification-\u043a\u0435\u0439\u0441\u0430), \u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0433\u043e\u043d \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u0435\u0433\u043e CI.<\/p>\n<p>\u041f\u044f\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043b\u044c\u0448\u0435 \u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u0441\u043d\u043e\u0441\u043e\u043a:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"233\" width=\"233\">\n<p align=\"left\">\u0422\u0435\u0440\u043c\u0438\u043d<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>Fulcio<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0446\u0435\u043d\u0442\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Sigstore: \u043c\u0435\u043d\u044f\u0435\u0442 OIDC-\u0442\u043e\u043a\u0435\u043d \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u0430 ~10 \u043c\u0438\u043d\u0443\u0442 \u0441 \u0432\u0448\u0438\u0442\u043e\u0439 identity \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>Rekor<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438: \u0442\u0443\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>DSSE<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (\u0442\u0443\u0442 \u2014 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u044f)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>in-toto \/ SLSA provenance<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u00ab\u0447\u0442\u043e \u0437\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0438 \u043a\u0430\u043a \u043e\u043d \u0441\u043e\u0431\u0440\u0430\u043d\u00bb \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"233\" width=\"233\">\n<p align=\"left\"><strong>trusted root<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 Fulcio\/Rekor; \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 TUF, \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0433\u043e \u0438\u0434\u0451\u0442 \u0432\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0443\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0438: <code>OIDC-\u0442\u043e\u043a\u0435\u043d \u2192 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u2192 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Fulcio \u2192 \u043f\u043e\u0434\u043f\u0438\u0441\u044c DSSE \u2192 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 Rekor \u2192 bundle<\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0434\u0451\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c08\/cbe\/b70\/c08cbeb7097584211f76e0da99217950.png\" alt=\"\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0447\u0435\u043a\u0430\u043d\u0438\u0442\u0441\u044f \u0432 CI \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0434\u0451\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u2014 \u043f\u0440\u043e\u0442\u0438\u0432 \u043a\u043e\u0440\u043d\u044f \u0434\u043e\u0432\u0435\u0440\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e TUF\" title=\"\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0447\u0435\u043a\u0430\u043d\u0438\u0442\u0441\u044f \u0432 CI \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0434\u0451\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u2014 \u043f\u0440\u043e\u0442\u0438\u0432 \u043a\u043e\u0440\u043d\u044f \u0434\u043e\u0432\u0435\u0440\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e TUF\" width=\"880\" height=\"405\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c08\/cbe\/b70\/c08cbeb7097584211f76e0da99217950.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c08\/cbe\/b70\/c08cbeb7097584211f76e0da99217950.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0447\u0435\u043a\u0430\u043d\u0438\u0442\u0441\u044f \u0432 CI \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0434\u0451\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u2014 \u043f\u0440\u043e\u0442\u0438\u0432 \u043a\u043e\u0440\u043d\u044f \u0434\u043e\u0432\u0435\u0440\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e TUF<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u043b\u0438\u0437: \u043e\u0434\u0438\u043d workflow<\/h3>\n<p>GitHub \u0443\u043c\u0435\u0435\u0442 \u0432\u0441\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u2014 \u0444\u0438\u0447\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.github.com\/en\/actions\/security-for-github-actions\/using-artifact-attestations\" rel=\"noopener noreferrer nofollow\">Artifact Attestations<\/a>. \u0414\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Sigstore \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 workflow, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u043e\u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445. \u041e\u043d \u043d\u0435 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439 \u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 <code>attest.yml<\/code> \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0430\u0443\u0434\u0438\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0451\u043c \u0432\u0430\u0436\u043d\u044b \u0434\u0435\u0442\u0430\u043b\u0438:<\/p>\n<pre><code class=\"yaml\">name: Atteston:  push:    tags: ['[0-9]*.[0-9]*.[0-9]*']permissions:  contents: readjobs:  attest:    name: Build provenance    runs-on: ubuntu-latest    permissions:      id-token: write      attestations: write      contents: read    steps:      - name: Checkout        uses: actions\/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3        with:          persist-credentials: false      - name: Build release tarball        run: |          tarball=\"dsse-${GITHUB_REF_NAME}.tar.gz\"          git archive --format=tar.gz --prefix=\"dsse-${GITHUB_REF_NAME}\/\" --output=\"${tarball}\" \"${GITHUB_SHA}\"          echo \"tarball=${tarball}\" &gt;&gt; \"$GITHUB_ENV\"      - name: Attest build provenance        uses: actions\/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0        with:          subject-path: ${{ env.tarball }}      - name: Download attestation bundle        env:          GH_TOKEN: ${{ github.token }}        run: |          gh attestation download \"${tarball}\" --repo \"${GITHUB_REPOSITORY}\"          mv sha256:*.jsonl \"${tarball}.sigstore.jsonl\"      - name: Hand off signed artifacts        uses: actions\/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1        with:          name: signed-release          path: |            *.tar.gz            *.sigstore.jsonl          if-no-files-found: error  release:    name: Publish release assets    needs: attest    runs-on: ubuntu-latest    permissions:      contents: write    steps:      - name: Fetch signed artifacts        uses: actions\/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1        with:          name: signed-release      - name: Create release with assets        env:          GH_TOKEN: ${{ github.token }}        run: |          gh release create \"${GITHUB_REF_NAME}\" \\            --repo \"${GITHUB_REPOSITORY}\" \\            --verify-tag \\            --title \"${GITHUB_REF_NAME}\" \\            --generate-notes \\            *.tar.gz *.sigstore.jsonl \\          || gh release upload \"${GITHUB_REF_NAME}\" --repo \"${GITHUB_REPOSITORY}\" --clobber *.tar.gz *.sigstore.jsonl  verify:    name: Verify published release    needs: release    runs-on: ubuntu-latest    permissions:      contents: read    steps:      - name: Download release assets        env:          GH_TOKEN: ${{ github.token }}        run: |          gh release download \"${GITHUB_REF_NAME}\" --repo \"${GITHUB_REPOSITORY}\" \\            --pattern '*.tar.gz' --pattern '*.sigstore.jsonl'      - name: Verify attestation (online)        env:          GH_TOKEN: ${{ github.token }}        run: gh attestation verify *.tar.gz --repo \"${GITHUB_REPOSITORY}\"      - name: Verify attestation (offline bundle)        env:          GH_TOKEN: ${{ github.token }}        run: gh attestation verify *.tar.gz --repo \"${GITHUB_REPOSITORY}\" --bundle *.sigstore.jsonl<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u2014 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0433\u0440\u043e\u0437 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b.<\/p>\n<p><strong>\u0422\u0440\u0438\u0433\u0433\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 \u0442\u0435\u0433\u0438.<\/strong> <code>tags: ['[0-9]*.[0-9]*.[0-9]*']<\/code> \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0447\u0435\u043a\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438 \u043f\u0443\u0448\u0435 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0433\u0430. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 <code>workflow_dispatch<\/code> \u0438 <code>tags: ['*']<\/code>: \u043a\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0439 \u0442\u0435\u0433, \u0442\u043e\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437, \u0438 \u0441\u0443\u0436\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e (\u043a \u043d\u0435\u043c\u0443 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u0447\u0435\u043a-\u043b\u0438\u0441\u0442\u0435).<\/p>\n<p><strong>\u0421\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u043d\u0435\u0442.<\/strong> <code>id-token: write<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0434\u0436\u043e\u0431\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c OIDC-\u0442\u043e\u043a\u0435\u043d; Fulcio \u043e\u0431\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442. \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0438 \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u0441 \u0434\u0436\u043e\u0431\u043e\u0439 \u2014 \u043a\u0440\u0430\u0441\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430, \u043f\u043e \u0434\u0436\u043e\u0431\u0430\u043c.<\/strong> \u0412\u0432\u0435\u0440\u0445\u0443 <code>contents: read<\/code> \u2014 \u0434\u0435\u0444\u043e\u043b\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e workflow. \u041f\u0440\u0430\u0432\u043e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c (<code>contents: write<\/code>, \u043d\u0443\u0436\u043d\u043e\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430) \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u0434\u0436\u043e\u0431\u044b <code>release<\/code>, \u0430 \u043f\u0440\u0430\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0438 (<code>id-token<\/code>\/<code>attestations: write<\/code>) \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0443 <code>attest<\/code>. \u0421\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u0443\u0439 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u0448\u0430\u0433 \u0441\u0431\u043e\u0440\u043a\u0438 \u2014 \u0443 \u043d\u0435\u0433\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0435 <code>verify<\/code>-\u0434\u0436\u043e\u0431\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 <code>contents: read<\/code>: \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0438\u0445 \u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p><strong>\u042d\u043a\u0448\u0435\u043d\u044b \u0437\u0430\u043f\u0438\u043d\u0435\u043d\u044b \u043f\u043e commit SHA.<\/strong> <code>actions\/checkout@df4cb1c0\u2026<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>@v6<\/code>. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 tj-actions \u0432\u044b\u0448\u0435? SHA \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 <code># v6.0.3<\/code> \u0440\u044f\u0434\u043e\u043c \u2014 \u0447\u0442\u043e\u0431\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0432\u0438\u0434\u0435\u043b \u0432\u0435\u0440\u0441\u0438\u044e. (\u0414\u0430, \u044d\u0442\u043e first-party \u044d\u043a\u0448\u0435\u043d\u044b GitHub, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u2014 \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u043c, \u0438\u043d\u0430\u0447\u0435 \u043e\u043d\u043e \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e.)<\/p>\n<p><code><strong>git archive<\/strong><\/code><strong>, \u043d\u0435 \u00ab\u0430\u0440\u0445\u0438\u0432 \u043f\u0430\u043f\u043a\u0438\u00bb.<\/strong> Tarball \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 git-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u2014 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0438 \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043a\u043e\u043f\u0438\u0438. <code>export-ignore<\/code> \u0432 <code>.gitattributes<\/code> \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u044b \u0438 CI-\u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u043e\u0432\u043d\u043e dist. \u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: \u00ab\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u00bb \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0431\u0430\u0439\u0442-\u0432-\u0431\u0430\u0439\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0440\u0435\u0434\u0435\u00bb \u2014 \u0444\u043e\u0440\u043c\u0430\u0442 \u0430\u0440\u0445\u0438\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0439 git\/gzip. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u043d\u0430\u0434\u043e <strong>\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c<\/strong>, \u0430 \u043d\u0435 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p><strong>\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u0438\u0437.<\/strong> \u042d\u0442\u043e \u0442\u043e\u0442 \u043f\u0443\u043d\u043a\u0442, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0441\u044f \u0437\u0430\u0442\u0435\u044f \u2014 \u0442\u0435\u0430\u0442\u0440: \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0438\u0437 Actions \u0436\u0438\u0432\u0451\u0442 90 \u0434\u043d\u0435\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043d\u0430. \u0414\u0436\u043e\u0431\u0430 <code>release<\/code> \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043a GitHub Release \u0438 tarball, \u0438 \u0435\u0433\u043e \u0431\u0430\u043d\u0434\u043b (<code>*.sigstore.jsonl<\/code>) \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043a\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0438 \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0425\u0432\u043e\u0441\u0442 <code>|| gh release upload --clobber<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0436\u043e\u0431\u0443 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0439: \u0440\u0435-\u0440\u0430\u043d \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442, \u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0442 \u0430\u0441\u0441\u0435\u0442\u044b.<\/p>\n<p><strong>\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0430\u043c \u0441\u0435\u0431\u044f.<\/strong> \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0436\u043e\u0431\u0430 <code>verify<\/code> \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442 <code>gh attestation verify<\/code> \u0434\u0432\u0430\u0436\u0434\u044b: \u0441 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 API GitHub \u0438 \u043f\u043e \u0431\u0430\u043d\u0434\u043b\u0443-\u0444\u0430\u0439\u043b\u0443 \u0438\u0437 \u0430\u0441\u0441\u0435\u0442\u043e\u0432 \u0440\u0435\u043b\u0438\u0437\u0430 \u2014 \u043e\u0431\u0430 \u043f\u0443\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b. \u042d\u0442\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u043b\u0438, \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0441\u043c\u043e\u0443\u043a-\u0442\u0435\u0441\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0435\u043b\u0438\u0437\u0435.<\/p>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">$ gh attestation download dsse-1.1.1.tar.gz --repo k2gl\/dsseWrote attestations to file sha256:7a719ac2\u20269f7ba.jsonl<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u2014 Sigstore bundle (<code>application\/<\/code><a href=\"http:\/\/vnd.dev\" rel=\"noopener noreferrer nofollow\"><code>vnd.dev<\/code><\/a><code>.sigstore.bundle.v0.3+json<\/code>): \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Fulcio, DSSE-\u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c in-toto Statement \u0438 \u0437\u0430\u043f\u0438\u0441\u044c Rekor \u0441 inclusion proof. \u0412\u0441\u0451 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u2014 \u0432 \u043e\u0434\u043d\u043e\u043c JSON.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e0e\/d80\/ee1\/e0ed80ee116ac04db6a15d65a227d0c5.png\" alt=\"\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 *.sigstore.jsonl: \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Fulcio (\u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b), DSSE-\u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u0441 in-toto Statement (\u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e) \u0438 \u0437\u0430\u043f\u0438\u0441\u044c Rekor (\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e) \u2014 \u0432\u0441\u0451 \u0434\u043b\u044f \u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c JSON.\" title=\"\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 *.sigstore.jsonl: \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Fulcio (\u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b), DSSE-\u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u0441 in-toto Statement (\u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e) \u0438 \u0437\u0430\u043f\u0438\u0441\u044c Rekor (\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e) \u2014 \u0432\u0441\u0451 \u0434\u043b\u044f \u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c JSON.\" width=\"880\" height=\"461\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e0e\/d80\/ee1\/e0ed80ee116ac04db6a15d65a227d0c5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e0e\/d80\/ee1\/e0ed80ee116ac04db6a15d65a227d0c5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>*.sigstore.jsonl<\/code>: \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Fulcio (\u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b), DSSE-\u043a\u043e\u043d\u0432\u0435\u0440\u0442 \u0441 in-toto Statement (\u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e) \u0438 \u0437\u0430\u043f\u0438\u0441\u044c Rekor (\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e) \u2014 \u0432\u0441\u0451 \u0434\u043b\u044f \u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c JSON.<\/figcaption><\/div>\n<\/figure>\n<h3>\u0412\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u0437 PHP<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5a6\/e7c\/157\/5a6e7c15727383e43e25ccee9d9bd1b3.png\" width=\"1560\" height=\"910\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5a6\/e7c\/157\/5a6e7c15727383e43e25ccee9d9bd1b3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5a6\/e7c\/157\/5a6e7c15727383e43e25ccee9d9bd1b3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e: \u043f\u0430\u043a\u0435\u0442\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0451 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u2014 \u043c\u043e\u0438, \u044f \u0438\u0445 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u044e. \u042d\u0442\u043e \u043d\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430, \u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0438\u0445 \u2014 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u0435\u043a \u043d\u0430 \u0431\u043e\u0435\u0432\u043e\u043c \u0440\u0435\u043b\u0438\u0437\u0435, \u0430 \u043d\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e Sigstore-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f PHP \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 (\u0434\u043b\u044f Go, Python, JS, Rust, Java, Ruby \u2014 \u0435\u0441\u0442\u044c; \u0434\u043b\u044f PHP \u0431\u044b\u043b <a href=\"https:\/\/github.com\/php-tuf\/php-tuf\" rel=\"noopener noreferrer nofollow\">php-tuf<\/a>, \u043d\u043e \u044d\u0442\u043e TUF-\u043a\u043b\u0438\u0435\u043d\u0442, \u0430 \u043d\u0435 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 Sigstore-\u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439). \u042d\u0442\u0443 \u043d\u0438\u0448\u0443 \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0435\u043a <code>k2gl\/*<\/code>.<\/p>\n<p>\u0421\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043e\u043d, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u0447\u0435\u0440\u0435\u0437 <code>composer require<\/code> \u2014 \u043a\u0430\u043a <code>sigstore-python<\/code> \u0447\u0435\u0440\u0435\u0437 pip; \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0442\u0443\u0442 \u043d\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b\u0435, \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442 \u0438 \u0441\u0430\u043c \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0442\u0435\u043c \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c.<\/p>\n<h4>\u0421\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0443\u0442\u044c \u2014 CLI<\/h4>\n<p>\u041f\u0430\u043a\u0435\u0442 \u0432\u0435\u0437\u0451\u0442 \u0431\u0438\u043d\u0430\u0440\u044c \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u042d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439:<\/p>\n<pre><code class=\"bash\">$ composer require k2gl\/sigstore-verify$ vendor\/bin\/sigstore-verify dsse-1.1.1.tar.gz dsse-1.1.1.tar.gz.sigstore.jsonl \\    --repository k2gl\/dsse --workflow attest.yml --ref refs\/tags\/1.1.1VERIFIEDsubject:   dsse-1.1.1.tar.gz (sha256:7a719ac27ce8c64af4992222213dcbfc240d412719e0b5e6107392f4e6c9f7ba)predicate: https:\/\/slsa.dev\/provenance\/v1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 0 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e; \u043b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1. <code>--trusted-root path<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0444\u0444\u043b\u0430\u0439\u043d; \u0434\u043b\u044f \u043d\u0435-GitHub \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0442\u043e\u0432 \u0435\u0441\u0442\u044c <code>--san<\/code>\/<code>--issuer<\/code>. JSON Lines \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0431\u0430\u043d\u0434\u043b\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 (\u0443\u0441\u043f\u0435\u0445, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d).<\/p>\n<h4>\u0418\u0437 \u043a\u043e\u0434\u0430 \u2014 \u0441 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0432\u0435\u043d\u0430\u043d\u0441\u043e\u043c<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043c\u0430\u0440\u043a\u0435\u0442\u043f\u043b\u0435\u0439\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0441\u0430\u043c\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u0451\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439), \u0430 \u043d\u0435 \u0432 \u0448\u0435\u043b\u043b\u0435, \u2014 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438\u0437 PHP:<\/p>\n<pre><code class=\"php\">&lt;?phpdeclare(strict_types=1);require __DIR__ . '\/vendor\/autoload.php';use K2gl\\InToto\\Statement;use K2gl\\Sigstore\\Bundle;use K2gl\\Sigstore\\IdentityPolicy;use K2gl\\Sigstore\\SigstoreVerifier;use K2gl\\Sigstore\\SubjectPolicy;use K2gl\\Sigstore\\TrustedRoot;use K2gl\\Slsa\\Provenance;$artifact = 'dsse-1.1.1.tar.gz';\/\/ `gh attestation download` writes JSON Lines: one Sigstore bundle per line.$lines = file('dsse-1.1.1.tar.gz.sigstore.jsonl', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);$bundle = Bundle::fromJson($lines[0]);\/\/ Fetch the Sigstore public-good trusted root via TUF \u2014 the only network call here.$trustedRoot = TrustedRoot::fromSigstorePublicGood();\/\/ Who must have signed: this repository's attest.yml workflow on this release tag.$identity = IdentityPolicy::githubActions(    repository: 'k2gl\/dsse',    workflow: 'attest.yml',    ref: 'refs\/tags\/1.1.1',);\/\/ What must have been signed: this exact file.$subject = new SubjectPolicy('sha256', hash_file('sha256', $artifact));$envelope = (new SigstoreVerifier)-&gt;verify(    bundle: $bundle,    trustedRoot: $trustedRoot,    identityPolicy: $identity,    subjectPolicy: $subject,);\/\/ The payload is authenticated now \u2014 model it with the typed packages.$statement = Statement::fromEnvelope($envelope);$provenance = Provenance::fromStatement($statement);echo \"VERIFIED\\n\";echo 'builder: ' . $provenance-&gt;runDetails-&gt;builder-&gt;id . \"\\n\";echo 'commit:  ' . $provenance-&gt;buildDefinition-&gt;resolvedDependencies[0]-&gt;digest['gitCommit'] . \"\\n\";<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code class=\"bash\">$ php verify.phpVERIFIEDbuilder: https:\/\/github.com\/k2gl\/dsse\/.github\/workflows\/attest.yml@refs\/tags\/1.1.1commit:  d9716be40f51e2bc32f6328a4f1830dd12156a45<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0435\u0441\u0443\u0442 \u0432\u0441\u044e \u0441\u0443\u0442\u044c.<\/p>\n<p><code><strong>TrustedRoot<\/strong><\/code><strong> \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0445\u043e\u0434 \u0432 \u0441\u0435\u0442\u044c.<\/strong> <code>fromSigstorePublicGood()<\/code> \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 Sigstore \u0447\u0435\u0440\u0435\u0437 TUF-\u043a\u043b\u0438\u0435\u043d\u0442 (<code>k2gl\/tuf<\/code>): \u0442\u043e\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 root \u2192 timestamp \u2192 snapshot \u2192 targets \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435. \u042d\u0442\u043e <strong>\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435<\/strong> \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043a\u043e\u0434 \u0432\u043e\u043e\u0431\u0449\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0435\u0442\u044c. \u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0444\u0444\u043b\u0430\u0439\u043d \u2014 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 <code>trusted_root.json<\/code> \u0438 \u0433\u0440\u0443\u0437\u0438\u0442\u0435 <code>TrustedRoot::fromJson()<\/code>; \u0441\u0430\u043c \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432 \u0441\u0435\u0442\u044c \u043d\u0435 \u0445\u043e\u0434\u0438\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0443\u0447\u0442\u0438\u0442\u0435: \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0438\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 trusted root \u0442\u0438\u0445\u043e \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 TUF.<\/p>\n<p><code><strong>IdentityPolicy<\/strong><\/code><strong> \u2014 <em>\u043a\u0442\u043e<\/em> \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b.<\/strong> \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Fulcio \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u0430 workflow:<\/p>\n<pre><code>SAN:    https:\/\/github.com\/k2gl\/dsse\/.github\/workflows\/attest.yml@refs\/tags\/1.1.1issuer: https:\/\/token.actions.githubusercontent.com<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0430\u0431\u0440\u0438\u043a\u0430 <code>githubActions()<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u044d\u0442\u043e\u0433\u043e SAN. \u0414\u0435\u0442\u0430\u043b\u044c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0436\u0435\u0447\u044c\u0441\u044f: <code>ref<\/code> \u0432 SAN \u2014 \u044d\u0442\u043e <strong>\u0442\u0440\u0438\u0433\u0433\u0435\u0440<\/strong> workflow. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0441 \u0432\u0435\u0442\u043a\u0438 \u0434\u0430\u0451\u0442 <code>@refs\/heads\/main<\/code>, \u0440\u0435\u043b\u0438\u0437\u043d\u0430\u044f \u043f\u043e \u0442\u0435\u0433\u0443 \u2014 <code>@refs\/tags\/1.1.1<\/code>. \u0414\u043b\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u0442\u0435\u0433\u0438 (<code>ref: 'refs\/tags\/' . $version<\/code>) \u2014 \u044d\u0442\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u0440\u0438\u0431\u0438\u0432\u0430\u0435\u0442 \u0442\u0443 \u0441\u0430\u043c\u0443\u044e rollback-\u0430\u0442\u0430\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u0433\u0440\u043e\u0437: \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0442\u0435\u0433\u0430. \u0415\u0441\u0442\u044c \u0438 <code>gitlabCi()<\/code>, \u0438 \u043e\u0431\u0449\u0438\u0439 <code>sanRegex()<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u044f\u0434\u0440\u043e \u0432\u0441\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438: \u00ab\u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u00bb \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0443\u043c\u0435\u0435\u0442 \u0438 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a. \u0417\u043d\u0430\u0447\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d <strong>\u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u044f \u0434\u043e\u0432\u0435\u0440\u044f\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c<\/strong>\u00bb.<\/p>\n<p><code><strong>SubjectPolicy<\/strong><\/code><strong> \u2014 <em>\u0447\u0442\u043e<\/em> \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e.<\/strong> \u0422\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b sha256 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 <code>subject<\/code> \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0438. \u0411\u0435\u0437 \u043d\u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u0443\u044e \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u044e <em>\u0434\u0440\u0443\u0433\u043e\u0433\u043e<\/em> \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u0442\u043e\u0433\u043e \u0436\u0435 \u0430\u0432\u0442\u043e\u0440\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/05a\/f22\/fba\/05af22fba5156b9e192758806fd13b33.png\" alt=\"\u0414\u0432\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: IdentityPolicy \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u00ab\u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u00bb (\u0440\u0430\u0437\u0431\u043e\u0440 SAN), SubjectPolicy \u2014 \u043d\u0430 \u00ab\u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e\u00bb (sha256 \u0444\u0430\u0439\u043b\u0430 == subject \u0432 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0438).\" title=\"\u0414\u0432\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: IdentityPolicy \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u00ab\u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u00bb (\u0440\u0430\u0437\u0431\u043e\u0440 SAN), SubjectPolicy \u2014 \u043d\u0430 \u00ab\u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e\u00bb (sha256 \u0444\u0430\u0439\u043b\u0430 == subject \u0432 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0438).\" width=\"880\" height=\"465\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/05a\/f22\/fba\/05af22fba5156b9e192758806fd13b33.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/05a\/f22\/fba\/05af22fba5156b9e192758806fd13b33.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0432\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: <code>IdentityPolicy<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u00ab\u043a\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u00bb (\u0440\u0430\u0437\u0431\u043e\u0440 SAN), <code>SubjectPolicy<\/code> \u2014 \u043d\u0430 \u00ab\u0447\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e\u00bb (sha256 \u0444\u0430\u0439\u043b\u0430 == subject \u0432 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0438).<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c <code>verify()<\/code> \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443, \u0438 <strong>\u043e\u0442\u043a\u0430\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0437\u0432\u0435\u043d\u0430 \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u044b\u043f\u0443\u0449\u0435\u043d CA \u0438\u0437 trusted root \u0438 \u0431\u044b\u043b \u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0438;<\/p>\n<\/li>\n<li>\n<p>SCT (Certificate Transparency) \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c CT-\u043b\u043e\u0433\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>DSSE-\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0438\u0441\u044c Rekor \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0443, inclusion proof \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a checkpoint, checkpoint \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043a\u043b\u044e\u0447\u043e\u043c \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0438\u0437 trusted root, signed entry timestamp \u0432\u0430\u043b\u0438\u0434\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f \u0438\u0437 \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>identity \u0438 subject policy \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/60d\/307\/99b\/60d30799ba3f7aa45351155d1abed0b0.png\" alt=\"\u0426\u0435\u043f\u043e\u0447\u043a\u0430 verify(): \u0448\u0435\u0441\u0442\u044c \u0437\u0432\u0435\u043d\u044c\u0435\u0432, \u0438 \u043e\u0442\u043a\u0430\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 (fail-closed), \u0430 \u043d\u0435 \u0442\u0438\u0445\u0438\u0439 \u00abverified\u00bb.\" title=\"\u0426\u0435\u043f\u043e\u0447\u043a\u0430 verify(): \u0448\u0435\u0441\u0442\u044c \u0437\u0432\u0435\u043d\u044c\u0435\u0432, \u0438 \u043e\u0442\u043a\u0430\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 (fail-closed), \u0430 \u043d\u0435 \u0442\u0438\u0445\u0438\u0439 \u00abverified\u00bb.\" width=\"880\" height=\"501\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/60d\/307\/99b\/60d30799ba3f7aa45351155d1abed0b0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/60d\/307\/99b\/60d30799ba3f7aa45351155d1abed0b0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 <code>verify()<\/code>: \u0448\u0435\u0441\u0442\u044c \u0437\u0432\u0435\u043d\u044c\u0435\u0432, \u0438 \u043e\u0442\u043a\u0430\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u2014 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 (fail-closed), \u0430 \u043d\u0435 \u0442\u0438\u0445\u0438\u0439 \u00abverified\u00bb.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043f\u0440\u043e Rekor \u2014 \u0437\u0430 \u043d\u0435\u0439 \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e\u0435. Rekor \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u0430\u043a <strong>Merkle-\u0434\u0435\u0440\u0435\u0432\u043e<\/strong> (\u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f, \u0447\u0442\u043e Certificate Transparency \u0434\u043b\u044f TLS, RFC 6962): \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u2014 \u043b\u0438\u0441\u0442, \u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u0435\u0441\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0445\u0435\u0448. Bundle \u043d\u0435\u0441\u0451\u0442 \u0432 \u0441\u0435\u0431\u0435 <strong>inclusion proof<\/strong> \u2014 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0445\u0435\u0448\u0435\u0439 \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u043b\u0438\u0441\u0442\u0430 \u0434\u043e \u043a\u043e\u0440\u043d\u044f. \u0412\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0435\u043d\u044c \u0438\u0437 \u0432\u0430\u0448\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0443\u0442\u0438; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043e\u0432\u043f\u0430\u0441\u0442\u044c \u0441 <strong>checkpoint<\/strong> \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u00ab\u0441\u043d\u0438\u043c\u043a\u043e\u043c\u00bb \u0434\u0435\u0440\u0435\u0432\u0430 (\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 + \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0445\u0435\u0448), \u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c checkpoint\u2019\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u043e\u043c Rekor <strong>\u0438\u0437 trusted root<\/strong>. \u041f\u043b\u044e\u0441 <strong>SET<\/strong> (signed entry timestamp) \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u2014 \u0438 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 ~10-\u043c\u0438\u043d\u0443\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0436\u0438\u0437\u043d\u0438 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430.<\/p>\n<p>\u0414\u0432\u0430 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u0441\u0451 \u044d\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 bundle \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 inclusion proof \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0445\u043e\u0434\u0430 \u0432 Rekor, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0444\u0444\u043b\u0430\u0439\u043d. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u00ab\u0432\u044b\u043d\u0443\u0442\u044c\u00bb \u0437\u0430\u0434\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c, \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0432 \u043a\u043e\u0440\u0435\u043d\u044c: \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u00ab\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b\u00bb \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u0430\u0448\u0435\u0433\u043e workflow \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u043f\u0440\u043e \u0442\u043e, <em>\u0447\u0442\u043e<\/em> \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e \u0432 DSSE: \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0433\u043e\u043b\u044b\u0439 payload, \u0430 \u0435\u0433\u043e <strong>PAE<\/strong> (pre-authentication encoding) \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430 <code>DSSEv1 SP len(type) SP type SP len(body) SP body<\/code>. \u042f\u0432\u043d\u044b\u0435 \u0434\u043b\u0438\u043d\u044b \u0438 \u0442\u0438\u043f \u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u0446\u0435\u043b\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0430\u0442\u0430\u043a \u043d\u0430 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0418 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043e\u043f\u0430\u0441\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u0435\u043c \u0441\u0440\u0430\u0437\u0443: \u00ab\u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u0430\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u043d\u0430 PHP?\u00bb \u2014 \u043d\u0435\u0442. \u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u043d\u0435 \u0441\u0432\u043e\u0438: ECDSA\/RSA \u2014 <code>ext-openssl<\/code> \u0438 phpseclib, Ed25519 \u2014 <code>ext-sodium<\/code>. \u0421\u0432\u043e\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 (\u0440\u0430\u0437\u0431\u043e\u0440 \u0431\u0430\u043d\u0434\u043b\u0430, \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a) \u2014 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u043e conformance.<\/p>\n<h3>Fail-closed: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442<\/h3>\n<p>\u0412\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u0432\u0441\u0435\u0433\u0434\u0430, \u0445\u0443\u0436\u0435 \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u2014 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043b\u043e\u0436\u043d\u0443\u044e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a demo \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d <code>negative.php<\/code>: \u0434\u0432\u0435 \u0430\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0431\u0430\u043d\u0434\u043b\u0430. \u041f\u043e\u0440\u0442\u0438\u043c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043d\u0430 \u0431\u0430\u0439\u0442 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0443\u0436\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 identity:<\/p>\n<pre><code class=\"bash\">$ php negative.phpOK: tampered artifact rejected \u2014 Attestation subject does not include the    expected sha256 digest \"c78b374858d64db6c229d302f86f0052afad45b905a4a79ba91657404f5eb057\".OK: wrong identity rejected \u2014 Certificate identity does not include the expected    SAN \"https:\/\/github.com\/evil\/dsse\/.github\/workflows\/attest.yml@refs\/tags\/1.1.1\".fail-closed works<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430 \u0436\u0435 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u2014 \u043d\u0430 \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u043d\u043e\u0435: \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043b\u0438 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0431\u0430\u043d\u0434\u043b\u0430 \u0434\u0430\u0451\u0442 <code>UnsupportedBundleException<\/code>, \u0430 \u043d\u0435 \u0442\u0438\u0445\u0438\u0439 \u00abverified\u00bb.<\/p>\n<h3>\u0412\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0432 CI\/CD: \u0433\u0435\u0439\u0442, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433, \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u2014 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0434\u0435\u043b\u0430. \u0412\u0442\u043e\u0440\u0430\u044f \u2014 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b.<\/p>\n<p><strong>\u0413\u0435\u0439\u0442 \u0432 \u0434\u0435\u043f\u043b\u043e\u0435.<\/strong> \u0421\u0430\u043c\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0447\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u0430\u043c\u043a\u0443 \u0432\u044b\u0448\u0435 \u2014 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0447\u0435\u0440\u0435\u0437 <code>composer install<\/code> \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442): \u0432\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u2014 PHAR, tarball \u0440\u0435\u043b\u0438\u0437\u0430, \u043e\u0431\u0440\u0430\u0437 \u2014 \u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043a\u0430\u0442\u043a\u043e\u0439. \u0428\u0430\u0433 \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"yaml\">      - name: Verify release before deploy        env:          GH_TOKEN: ${{ github.token }}        run: |          gh release download \"$VERSION\" --repo acme\/app --pattern '*.tar.gz' --pattern '*.sigstore.jsonl'          vendor\/bin\/sigstore-verify \"app-${VERSION}.tar.gz\" \"app-${VERSION}.tar.gz.sigstore.jsonl\" \\            --repository acme\/app --workflow attest.yml --ref \"refs\/tags\/${VERSION}\" \\            --trusted-root trusted_root.json<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u043e\u0442\u043a\u0430\u0437\u0430 \u0432\u0430\u0436\u043d\u0430: \u043f\u0440\u0438 <code>SigstoreException<\/code> \u0433\u0435\u0439\u0442 <strong>\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0439 \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u043b\u0435\u0440\u0442<\/strong>, \u0430 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 warning \u0432 \u043b\u043e\u0433. \u041d\u0435 \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u2014 \u043d\u0435 \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c.<\/p>\n<p><strong>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0436\u0443\u0440\u043d\u0430\u043b\u0430.<\/strong> \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c Rekor \u2014 \u044d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (\u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0435\u0451 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0448\u0435). \u0415\u0441\u043b\u0438 \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u0430\u0448\u0435\u0433\u043e workflow \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438, \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e. \u0421\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u043c <a href=\"https:\/\/github.com\/sigstore\/rekor-monitor\" rel=\"noopener noreferrer nofollow\">rekor-monitor<\/a> \u2014 \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e weekly-workflow, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0449\u0435\u0442 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0432\u044b\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043c\u043e\u044e <code>attest.yml<\/code> identity, \u0438 \u0437\u0430\u0432\u043e\u0434\u0438\u0442 issue \u043d\u0430 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"yaml\">name: Attestation watchon:  schedule:    - cron: '23 6 * * 1' # weekly  workflow_dispatch:permissions: read-alljobs:  rekor-identity-monitor:    permissions:      contents: read      issues: write      id-token: write    uses: sigstore\/rekor-monitor\/.github\/workflows\/reusable_monitoring.yml@&lt;pin-sha&gt; # main    with:      file_issue: true      artifact_retention_days: 14      config: |        monitoredValues:          certIdentities:            - certSubject: https:\/\/github\\.com\/acme\/[^\/]+\/\\.github\/workflows\/attest\\.yml@.+              issuers:                - https:\/\/token\\.actions\\.githubusercontent\\.com<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041f\u043b\u0430\u043d \u043d\u0430 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442.<\/strong> \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438, \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c (\u0443\u0433\u043d\u0430\u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442, \u0443\u0442\u0451\u043a \u0442\u043e\u043a\u0435\u043d): \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u043a\u0440\u0435\u0434\u044b \u0438 PAT, \u0440\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451; \u0441\u043d\u044f\u0442\u044c \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Packagist \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0435\u0433\/\u0440\u0435\u043b\u0438\u0437; \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c advisory (GitHub Security Advisory) \u0438 \u0444\u0438\u043a\u0441-\u0440\u0435\u043b\u0438\u0437; \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0441\u0442-\u043c\u043e\u0440\u0442\u0435\u043c \u2014 \u0438 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u043d\u0430\u043d\u0441 \u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f: <code>gitCommit<\/code> \u0438\u0437 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0439 \u0434\u0430\u0451\u0442 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u043c\u0438\u0442 \u0438 \u043a\u0430\u043a\u0430\u044f \u0434\u0436\u043e\u0431\u0430 \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442.<\/p>\n<h3>\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u044d\u0442\u043e (\u043d\u0435) \u043d\u0443\u0436\u043d\u043e<\/h3>\n<p>\u041c\u0438\u043d\u0438\u043c\u0443\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u00ab\u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u00bb \u0432 \u00ab\u0443 \u043d\u0430\u0441 \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437\u00bb:<\/p>\n<ol>\n<li>\n<p><code>main<\/code> \u043f\u043e\u0434 branch protection: PR + \u0440\u0435\u0432\u044c\u044e, \u0431\u0435\u0437 force-push (\u0441\u043e\u043b\u043e-\u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u2014 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c PR + \u0437\u0430\u043f\u0440\u0435\u0442 force-push, \u0433\u0435\u0439\u0442\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 CI; \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0432\u044c\u044e \u2014 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440);<\/p>\n<\/li>\n<li>\n<p>2FA \u0443 \u0432\u0441\u0435\u0445 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 Packagist;<\/p>\n<\/li>\n<li>\n<p><strong>tag protection \/ ruleset<\/strong>: \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440 (\u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 = \u043f\u0440\u0430\u0432\u043e \u0447\u0435\u043a\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u043b\u0438\u0437\u044b);<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u044d\u043a\u0448\u0435\u043d\u044b \u0437\u0430\u043f\u0438\u043d\u0435\u043d\u044b \u043f\u043e SHA;<\/p>\n<\/li>\n<li>\n<p><code>permissions<\/code> \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b, \u043f\u0440\u0430\u0432\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0438\/\u0437\u0430\u043f\u0438\u0441\u0438 \u2014 \u0442\u043e\u0447\u0435\u0447\u043d\u043e \u043f\u043e \u0434\u0436\u043e\u0431\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u0447\u043d\u044b\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 OIDC;<\/p>\n<\/li>\n<li>\n<p><code>attest.yml<\/code> \u043d\u0430 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0445 \u0442\u0435\u0433\u0430\u0445, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u2014 \u0432 Release;<\/p>\n<\/li>\n<li>\n<p>\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f \u2014 \u0433\u0435\u0439\u0442 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0434\u0435\u043f\u043b\u043e\u0435\u043c;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 Rekor \u0432\u043a\u043b\u044e\u0447\u0451\u043d.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0451\u0442 \u0441\u0435\u0433\u043e\u0434\u043d\u044f:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"301\" width=\"301\">\n<p align=\"left\">\u0412\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0443\u0436\u043d\u043e \u043b\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"301\" width=\"301\">\n<p align=\"left\">\u041c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435.<\/strong> \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u2014 ~38 \u0441\u0442\u0440\u043e\u043a, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u041a\u0430\u043d\u0430\u043b <code>composer install<\/code> \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u043d\u0430\u043d\u0441 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"301\" width=\"301\">\n<p align=\"left\">\u0414\u0435\u043f\u043b\u043e\u0439 PHAR\/tarball\/\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0439\u0442\u0435<\/strong> \u2014 \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"301\" width=\"301\">\n<p align=\"left\">\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 <code>composer install<\/code> \u0438\u0437 Packagist<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0426\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 (\u0441\u043c. \u0440\u0430\u043c\u043a\u0443 \u043f\u0440\u043e zipball); \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"301\" width=\"301\">\n<p align=\"left\">\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2014 \u0447\u0435\u0441\u0442\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0421\u0442\u0435\u043a<\/h3>\n<p>\u0412\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u2014 PHP \u2265 8.1, PHPStan level 9, MIT, \u0431\u0435\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 (openssl\/sodium \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u041f\u0430\u043a\u0435\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><a href=\"https:\/\/github.com\/k2gl\/sigstore-verify\" rel=\"noopener noreferrer nofollow\">k2gl\/sigstore-verify<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 Sigstore-\u0431\u0430\u043d\u0434\u043b\u043e\u0432 + CLI: DSSE \u0438 message-\u043f\u043e\u0434\u043f\u0438\u0441\u0438, Rekor v1\/v2, RFC 3161, SCT, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438 keyless \u0431\u0430\u043d\u0434\u043b\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><a href=\"https:\/\/github.com\/k2gl\/slsa-provenance\" rel=\"noopener noreferrer nofollow\">k2gl\/slsa-provenance<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u043e\u0434\u0435\u043b\u0438 SLSA Provenance v1 \u0438 v0.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><a href=\"https:\/\/github.com\/k2gl\/in-toto-attestation\" rel=\"noopener noreferrer nofollow\">k2gl\/in-toto-attestation<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">in-toto Statement v1 \u0438 v0.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><a href=\"https:\/\/github.com\/k2gl\/dsse\" rel=\"noopener noreferrer nofollow\">k2gl\/dsse<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">DSSE-\u043a\u043e\u043d\u0432\u0435\u0440\u0442: PAE, sign\/verify (ECDSA P-256, Ed25519, raw \u0438 DER)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><a href=\"https:\/\/github.com\/k2gl\/tuf\" rel=\"noopener noreferrer nofollow\">k2gl\/tuf<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 fail-closed TUF-\u043a\u043b\u0438\u0435\u043d\u0442 (spec 1.0) \u0434\u043b\u044f \u043a\u043e\u0440\u043d\u044f \u0434\u043e\u0432\u0435\u0440\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0441\u0451 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 clone-and-run \u0432 companion-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/k2gl\/sigstore-php-demo\" rel=\"noopener noreferrer nofollow\"><strong>k2gl\/sigstore-php-demo<\/strong><\/a>: <code>composer install<\/code> \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0444\u0444\u043b\u0430\u0439\u043d.<\/p>\n<h3>\u041a\u0443\u0434\u0430 \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<ol>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 <code>attest.yml<\/code> (\u0432\u044b\u0448\u0435) \u0432 \u0441\u0432\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u0447\u0435\u043a-\u043b\u0438\u0441\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0448\u043d\u0438\u0442\u0435 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0439 \u0442\u0435\u0433 \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0438 Release \u0441 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c\u0438 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0441\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <code>gh attestation verify<\/code>, CLI \u0438\u043b\u0438 \u043a\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u0435\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c\u0430: <code>composer require<\/code> \u0442\u044f\u043d\u0435\u0442 zipball, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 GitHub \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443, \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u00ab\u0442\u043e, \u0447\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u0435\u0442 composer\u00bb, \u043d\u0435\u0447\u0435\u0433\u043e. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u2014 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b (PHAR, \u0440\u0435\u043b\u0438\u0437\u044b, \u043e\u0431\u0440\u0430\u0437\u044b, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u044b), \u0438 \u043a\u0430\u043a \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 Composer-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u0437\u0440\u0435\u0435\u0442 \u0434\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0430\u0442\u0442\u0435\u0441\u0442\u0430\u0446\u0438\u0439 (\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b\u0438 npm \u0438 PyPI) \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043d\u0430 PHP \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u0430.<\/p>\n<p>Issues \u0438 \u0444\u0438\u0447\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u2014 \u0432 <a href=\"https:\/\/github.com\/k2gl\/sigstore-verify\/issues\" rel=\"noopener noreferrer nofollow\">k2gl\/sigstore-verify<\/a>. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0446\u0435\u043d\u043d\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0430\u043d\u0434\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 <strong>\u043e\u0442\u0432\u0435\u0440\u0433<\/strong>: fail-closed \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043b\u0438\u0431\u043e \u0434\u044b\u0440\u0430 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u043c\u043e\u0439 \u0431\u0443\u0434\u0443\u0449\u0438\u0439 \u0440\u0435\u043b\u0438\u0437. \u041d\u0435\u0441\u0438\u0442\u0435. \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0438 \u043d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u2014 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0433\u0440\u043e\u0437.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1048056\/\">https:\/\/habr.com\/ru\/articles\/1048056\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u043c\u0430\u0440\u0442\u0435 2021 \u0433\u043e\u0434\u0430 \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 PHP \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u0438 \u0434\u0432\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0435\u0432\u0438\u043d\u043d\u043e \u2014 [skip-ci] Fix typo, \u2014 \u0430 \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u0437\u043d\u0430\u0447\u0438\u043b\u0441\u044f \u0420\u0430\u0441\u043c\u0443\u0441 \u041b\u0435\u0440\u0434\u043e\u0440\u0444 (\u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u044f\u0437\u044b\u043a\u0430). \u0415\u0433\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0438 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438 \u2014 \u0442\u043e\u0433\u0434\u0430 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0448\u0438\u043b \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e, \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0432 \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043e\u0442\u043a\u0430\u0442\u0430 (Revert &#171;Revert &#171;[skip-ci] Fix typo&#187;&#187;) \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0432 \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0435\u043c \u041d\u0438\u043a\u0438\u0442\u044b \u041f\u043e\u043f\u043e\u0432\u0430 (\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044f\u0434\u0440\u0430). \u041e\u0431\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0431\u044d\u043a\u0434\u043e\u0440: \u0435\u0441\u043b\u0438 \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a User-Agentt \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043d\u0430 zerodium, PHP \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u2014 \u0432\u0441\u0451 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u2014 \u043a\u0430\u043a PHP-\u043a\u043e\u0434. \u0423\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c, \u043a\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0431\u044b \u0434\u043e \u044d\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438.\u0412\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0431\u044d\u043a\u0434\u043e\u0440 \u0442\u0430\u043a \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e php_zlib_output_compression_start() (\u0444\u0430\u0439\u043b ext\/zlib\/zlib.c), \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0433\u043e HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430:\/\/ $_SERVER[&#8216;HTTP_USER_AGENTT&#8217;] \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a &#171;User-Agentt&#187;if ((enc = zend_hash_str_find(&#8230;, &#171;HTTP_USER_AGENTT&#187;, sizeof(&#171;HTTP_USER_AGENTT&#187;) &#8212; 1))) {    convert_to_string(enc);    if (strstr(Z_STRVAL_P(enc), &#171;zerodium&#187;)) {        zend_eval_string(Z_STRVAL_P(enc) + 8, NULL, &#171;REMOVETHIS: sold to zerodium, mid 2017&#187;);    }}zend_eval_string() \u2014 \u044d\u0442\u043e C-\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 eval(): \u0441\u0442\u0440\u043e\u043a\u0430-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a PHP-\u043a\u043e\u0434. + 8 \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 zerodium (\u0432\u043e\u0441\u0435\u043c\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432), \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u0448\u043b\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 REMOVETHIS: sold to zerodium, mid 2017 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435 \u2014 \u0446\u0438\u043d\u0438\u0447\u043d\u0430\u044f \u043e\u0442\u0441\u044b\u043b\u043a\u0430 \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443 \u044d\u043a\u0441\u043f\u043b\u043e\u0439\u0442\u043e\u0432 Zerodium.\u041d\u0438 \u0420\u0430\u0441\u043c\u0443\u0441, \u043d\u0438 \u041d\u0438\u043a\u0438\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u043b\u0438. \u0410\u0442\u0430\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e Git-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 PHP \u2014 git.php.net: \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0437\u0430\u043f\u0443\u0448\u0438\u043b\u0438 \u043f\u043e HTTPS \u0441 \u043f\u0430\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439, \u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0443\u0442\u0435\u043a\u043b\u0430 \u0431\u0430\u0437\u0430 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 master.php.net \u2014 \u0441\u0430\u043c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435 \u0432\u0437\u043b\u0430\u043c\u044b\u0432\u0430\u043b\u0438. \u041f\u043e\u0439\u043c\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e: \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0443\u0436\u0435 \u0437\u0430\u043f\u0443\u0448\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u044b, \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e \u043f\u043e\u0434 \u0434\u0438\u0444\u0444\u043e\u043c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 zerodium. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 PHP \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0430 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 GitHub, \u043e\u0442\u043a\u0430\u0437\u0430\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0435 \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441\u0440\u0430\u0437\u0443. \u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0430\u0432\u0442\u043e\u0440\u0430 (\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e \u2014 \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u043d\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b, \u0438\u043c\u044f \u0432 Author \u043f\u043e\u0434\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439). \u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0437\u043b\u043e\u043c\u0430\u043b\u0438). \u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0442\u043e, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u043d\u0430 \u043a\u043e\u0434-\u0440\u0435\u0432\u044c\u044e, \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043b\u0435\u0436\u0438\u0442 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430, \u0438 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043b\u044e\u0431\u043e\u0435 \u0435\u0451 \u0437\u0432\u0435\u043d\u043e.\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0430\u0442\u0430\u043a\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0446\u0435\u043f\u043e\u0447\u043a\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b (GPG, \u0445\u0435\u0448\u0438, \u00ab\u043d\u0443 \u0443 \u043d\u0430\u0441 \u0436\u0435 HTTPS\u00bb) \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0435\u0451 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e, \u0438 \u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u043a\u0430\u0440\u0442\u0430 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 (\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0430\u0442\u0430\u043a \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0433\u0440\u043e\u0437), \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0435\u043b\u0438\u0437 PHP-\u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u0432 CI \u0438 \u0438\u0437 \u043a\u043e\u0434\u0430. \u041a\u043e\u0434\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e.\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a: \u043f\u044f\u0442\u044c \u0437\u0432\u0435\u043d\u044c\u0435\u0432, \u043a\u0430\u0436\u0434\u043e\u0435 \u0430\u0442\u0430\u043a\u0443\u044e\u0442\u00ab\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043e\u043a \u041f\u041e\u00bb (software supply chain) \u0437\u0432\u0443\u0447\u0438\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 \u0437\u0432\u0435\u043d\u044c\u044f. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0443\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 \u043e\u0442 \u043c\u044b\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c vendor\/:\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u2192 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 (git) \u2192 \u0441\u0431\u043e\u0440\u043a\u0430 (CI) \u2192 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u2192 \u0440\u0435\u0435\u0441\u0442\u0440 \u2192 \u0412\u042b\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u044b\u043a \u2014 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430, \u0433\u0434\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c, \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0441\u0442\u044c \u0433\u0440\u043e\u043c\u043a\u0438\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442.\u0417\u0432\u0435\u043d\u043e 1. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0442\u043e\u0442, \u043a\u0442\u043e \u0435\u0433\u043e \u043f\u0438\u0448\u0435\u0442\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0443\u0442\u044c \u2014 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438. \u0421\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u0432\u0430: \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u043a\u0430\u043a \u0441 git.php.net) \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u044c \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u044e\u0442.\u0412\u0442\u043e\u0440\u043e\u0435 \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f event-stream (2018). \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f npm-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 (\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0432 \u043d\u0435\u0434\u0435\u043b\u044e), \u0443 \u0432\u044b\u0433\u043e\u0440\u0435\u0432\u0448\u0435\u0433\u043e \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u0451\u043b \u0434\u043e\u0431\u0440\u043e\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u043c\u043e\u0449\u044c, \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0440\u043e\u0441\u043e\u0432\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043f\u0430\u043a\u0435\u0442 \u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043f\u0440\u0430\u0432\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c flatmap-stream \u0441 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u0440\u0438\u043f\u0442\u043e\u043a\u043e\u0448\u0435\u043b\u0451\u043a (Copay). \u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0436\u0438\u043b \u0432 \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0436\u0435\u0440\u0442\u0432\u044b. \u0421\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430: \u00ab\u043a\u043e\u043c\u043c\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u00bb \u0438 \u00ab\u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u00bb \u2014 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0443\u0433\u043e\u043d\u044f\u044e\u0442, \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u044e\u0442, \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442.\u0417\u0432\u0435\u043d\u043e 2. \u0421\u0431\u043e\u0440\u043a\u0430: \u0440\u0430\u0437\u0440\u044b\u0432 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u043c\u0422\u0443\u0442 \u0436\u0438\u0432\u0451\u0442 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u0432\u0430\u0440\u043d\u0430\u044f \u0430\u0442\u0430\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043b\u0435\u0442 \u2014 \u0431\u044d\u043a\u0434\u043e\u0440 \u0432 xz\/liblzma (CVE-2024-3094, \u043c\u0430\u0440\u0442 2024).\u0415\u0451 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0432 \u0442\u043e\u043c, \u0433\u0434\u0435 \u043f\u0440\u044f\u0442\u0430\u043b\u0441\u044f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441. \u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 xz \u0431\u044b\u043b \u0447\u0438\u0441\u0442: \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u0434-\u0440\u0435\u0432\u044c\u044e \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u041d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 (\u0438 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432) \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u043d\u0435 git-\u0434\u0435\u0440\u0435\u0432\u043e, \u0430 release-tarball \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c. \u0418 \u0432\u043e\u0442 \u0432 tarball\u2019\u0435 \u043b\u0435\u0436\u0430\u043b \u0444\u0430\u0439\u043b build-to-host.m4, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0432 Git. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u043d \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b \u00ab\u0438\u0441\u043f\u043e\u0440\u0447\u0435\u043d\u043d\u044b\u0439\u00bb \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 \u0441\u043a\u0440\u0438\u043f\u0442, \u0442\u043e\u0442 \u2014 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432 liblzma \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 SSH-\u043a\u043b\u044e\u0447\u0435\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.\u0417\u0430\u043c\u0435\u0442\u0438\u043b \u044d\u0442\u043e \u043d\u0435 \u0430\u0443\u0434\u0438\u0442\u043e\u0440 \u043a\u043e\u0434\u0430, \u0430 \u0410\u043d\u0434\u0440\u0435\u0441 \u0424\u0440\u043e\u0439\u043d\u0434 \u2014 \u0438\u043d\u0436\u0435\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u0440\u044f\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c PostgreSQL \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0445\u043e\u0434 \u043f\u043e SSH \u0441\u0442\u0430\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0434\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e, \u0430 sshd \u2014 \u0441\u044a\u0435\u0434\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 CPU. \u041f\u043e\u0442\u044f\u043d\u0443\u043b \u0437\u0430 \u043d\u0438\u0442\u043e\u0447\u043a\u0443 \u2014 \u0438 \u0440\u0430\u0437\u043c\u043e\u0442\u0430\u043b \u043c\u043d\u043e\u0433\u043e\u043b\u0435\u0442\u043d\u044e\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u00ab\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e\u00bb \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430, \u0438 \u043e\u043d \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438: \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u0432 git, \u0438 \u0442\u043e, \u0447\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u043e \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u0415\u0441\u043b\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e, \u043a\u0443\u0434\u0430 \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0438\u0441\u0442\u043e\u0442\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442.\u0421\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u2014 \u043e\u043d\u0430 \u0438 \u0435\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0437\u0438\u0441\u0430 \u00abgit \u2260 tarball\u00bb:build-to-host.m4 \u2014 \u0444\u0430\u0439\u043b-\u043c\u0430\u043a\u0440\u043e\u0441 autoconf \u2014 \u043b\u0435\u0436\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 release-tarball\u2019\u0430\u0445 (5.6.0\/5.6.1), \u0432 git \u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 .\/configure \u0438 \u0438\u0441\u043a\u0430\u043b \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u00ab\u043d\u0443\u0436\u043d\u044b\u0439\u00bb \u0444\u0430\u0439\u043b \u043f\u043e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435:grep -aErls &#171;#{4}\\[\\[:alnum:\\]\\]{5}#{4}$&#187; $srcdir\/ 2&gt;\/dev\/null\u041f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430, \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430: tests\/files\/bad-3-corrupt_lzma2.xz (\u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f) \u0438 tests\/files\/good-large_compressed.lzma (\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u0438\u043a + \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434). \u0414\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438-\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043c\u0443\u0441\u043e\u0440 \u0432 tests\/ \u2014 \u043d\u043e\u0440\u043c\u0430, \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u043d\u0435 \u0446\u0435\u043f\u043b\u044f\u0435\u0442.\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u043b\u0430\u0441\u044c \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u2014 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u0445\u043e\u0434\u0438\u043b \u043f\u0440\u044f\u043c\u043e \u0432 \/bin\/sh:cat tests\/files\/bad-3-corrupt_lzma2.xz | tr &#171;\\t \\-_&#187; &#187; \\t_\\-&#187; | xz -d\u041d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 make \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u043b \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 ~88 \u041a\u0411 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0432\u043c\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0435\u0433\u043e \u0432 liblzma, \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e isarch_extension_supported() \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0442\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0430 getcpuid() \u0438\u0437 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u0438\u043a\u0430.getcpuid() \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f IFUNC-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u043e\u043c \u2014 \u043e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438, \u0435\u0449\u0451 \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a GOT\/PLT \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f read-only. \u0420\u0435\u0437\u043e\u043b\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043b GOT, \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044f RSA_public_decrypt, \u2014 \u0438 \u0432 sshd (\u0442\u044f\u043d\u0443\u0449\u0435\u043c liblzma \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 systemd) \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0441\u044f \u043e\u0431\u0445\u043e\u0434 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e.\u041d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0442\u0430\u0434\u0438\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u0432 git: \u0440\u0435\u0432\u044c\u044e\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0432\u0438\u0434\u0435\u043b \u0447\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434.\u0417\u0432\u0435\u043d\u043e 3. CI\/CD: \u0430\u0442\u0430\u043a\u0443\u044e\u0442 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0420\u0430\u0437 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 CI, \u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f CI \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430. \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u2014 tj-actions\/changed-files (CVE-2025-30066, \u043c\u0430\u0440\u0442 2025), \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 GitHub Action, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0432 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 23 000 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432.\u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435: \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u0442\u0435\u0433\u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u0422\u0435\u0433\u0438 v1 \u2026 v45 \u2014 \u0432\u0441\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u043b\u0438\u0441\u044c \u0447\u0443\u0436\u0438\u0435 workflow, \u2014 \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442. \u0422\u043e\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0438 \u0432\u044b\u0433\u0440\u0435\u0431\u0430\u043b \u0441\u0435\u043a\u0440\u0435\u0442\u044b (\u0442\u043e\u043a\u0435\u043d\u044b, \u043a\u043b\u044e\u0447\u0438, PAT) \u043f\u0440\u044f\u043c\u043e \u0432 \u043b\u043e\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445.\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u0434\u0435\u0442\u0430\u043b\u044c \u2014 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0433\u0438. \u041e\u043d\u0430 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0437\u0430\u0449\u0438\u0442\u044b.\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430: \u0432\u0430\u0448 \u0431\u0438\u043b\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u0434 (\u044d\u043a\u0448\u0435\u043d\u044b, \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043e\u0431\u0440\u0430\u0437\u044b). \u0412\u0435\u0440\u0441\u0438\u044f @v4 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f, \u044d\u0442\u043e \u00ab\u0434\u0430\u0439 \u043c\u043d\u0435 \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u0433 v4\u00bb, \u0430 \u0442\u0435\u0433 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u0442\u044c.\u0417\u0432\u0435\u043d\u043e 4. \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0438 \u0440\u0435\u0435\u0441\u0442\u0440: \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 CI \u0447\u0438\u0441\u0442\u044b, \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u2014 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0435\u0441\u0442\u0440 (npm, PyPI, Packagist). \u0420\u0435\u0435\u0441\u0442\u0440 \u2014 \u0435\u0434\u0438\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c.\u041a\u043b\u0430\u0441\u0441\u0438\u043a\u0430 \u2014 ua-parser-js (\u043e\u043a\u0442\u044f\u0431\u0440\u044c 2021): \u0443 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0443\u0433\u043d\u0430\u043b\u0438 npm-\u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441 \u043a\u0440\u0438\u043f\u0442\u043e\u043c\u0430\u0439\u043d\u0435\u0440\u043e\u043c \u0438 \u0442\u0440\u043e\u044f\u043d\u043e\u043c \u0434\u043b\u044f \u043a\u0440\u0430\u0436\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439. \u041f\u0430\u043a\u0435\u0442 \u0441 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0432 \u043d\u0435\u0434\u0435\u043b\u044e. \u0427\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u2014 \u0442\u043e \u0436\u0435 \u0441 coa \u0438 rc. \u041d\u0435 \u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u043d\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 Git \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u043e\u0434 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c.\u0421\u044e\u0434\u0430 \u0436\u0435 \u2014 \u0442\u0430\u0439\u043f\u0441\u043a\u0432\u043e\u0442\u0442\u0438\u043d\u0433: \u043f\u0430\u043a\u0435\u0442 reqeusts \u0432\u043c\u0435\u0441\u0442\u043e requests, \u0440\u0430\u0441\u0447\u0451\u0442 \u043d\u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u0432 composer require.\u0423\u0440\u043e\u043a \u0437\u0432\u0435\u043d\u0430: \u00ab\u0441\u043a\u0430\u0447\u0430\u043d\u043e \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u043f\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c\u00bb \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u0432\u044b \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0435, \u0438 \u0438\u0437 \u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438\u00bb.\u0417\u0432\u0435\u043d\u043e 5. PHP-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0413\u0434\u0435 \u0432\u043e \u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c PHP \u0438 Composer? \u0412 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445:\u0421\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u044b Composer. post-install-cmd, post-autoload-dump \u0438 composer-\u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 PHP \u0432\u043e \u0432\u0440\u0435\u043c\u044f composer install \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u043d\u0430 CI. \u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u0436\u0434\u0451\u0442 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430, \u043e\u043d\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435.\u0422\u0430\u0439\u043f\u0441\u043a\u0432\u043e\u0442\u0442\u0438\u043d\u0433 \u043d\u0430 Packagist \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 npm.\u0418 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0442\u0435\u043c\u044b: \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 composer require, Packagist \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0444\u0430\u0439\u043b, \u0430 zipball, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 GitHub \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443. \u0415\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e \u0438 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u00ab\u0442\u043e, \u0447\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u0435\u0442 composer\u00bb \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0447\u0435\u0433\u043e \u2014 \u043d\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c.\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u0435\u043d (\u0438 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435), \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044e \u044f\u0432\u043d\u043e \u0438 \u0432\u044b\u043d\u0435\u0441\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.\u0421\u0440\u0430\u0437\u0443 \u0447\u0435\u0441\u0442\u043d\u043e, \u0431\u0435\u0437 \u0438\u043b\u043b\u044e\u0437\u0438\u0439. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u0442\u0430\u0432\u044f\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u043c composer install \u0438\u0437 Packagist \u2014 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442. Composer \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0430 zipball, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 GitHub \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443; \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043c \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0447\u0435\u0433\u043e. \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u2014 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b: PHAR, \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0435 tarball\u2019\u044b, Docker-\u043e\u0431\u0440\u0430\u0437\u044b, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0440\u0435\u0435\u0441\u0442\u0440\u044b. \u0418 \u043e\u043d\u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043a\u0430\u043a \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u2014 \u00ab\u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0438 \u043a\u0430\u043a\u0438\u043c workflow \u0441\u043e\u0431\u0440\u0430\u043d\u043e\u00bb. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u2014 \u043d\u0438\u0436\u0435; \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u0440\u0436\u0438\u043c \u044d\u0442\u043e \u0432 \u0443\u043c\u0435.\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u00ab\u0422\u0430\u043a \u044d\u0442\u043e \u0436\u0435&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483805","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483805"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483805\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}