Введение

Программное обеспечение, предназначенное для обновления, исправления или улучшения другой программы.

Патч — это набор изменений в компьютерной программе или ее вспомогательных данных, предназначенных для ее обновления или исправления. Это включает в себя исправления ошибок, устраняющие уязвимости в системе безопасности. Патчи часто разрабатываются для улучшения функциональности, удобства использования или производительности программы. Большинство патчей предоставляются поставщиками программного обеспечения для обновления операционных систем и приложений. Патчи могут быть установлены автоматически или вручную, программистом, с помощью инструмента редактирования или отладчика. Они могут быть применены к файлам программ на носителе информации или в компьютерной памяти. Патчи могут быть постоянными (до повторного применения) или временными. Аналогично, патчи могут быть созданы вручную или с помощью автоматизированного инструмента, который сравнивает два похожих файла и определяет необходимые изменения для преобразования одного в другой. Большинство патчей должны применяться к конкретной версии файла, для которой они предназначены, хотя если изменение незначительно и применимо к нескольким версиям, это требование может не соблюдаться. Многие автоматизированные инструменты для применения патчей поддерживают патчи для нескольких версий файлов, определяя версию существующего файла и применяя соответствующий патч. По мере выпуска новых версий, общий размер таких патчей может превысить размер обновленного файла, в этом случае количество поддерживаемых предыдущих версий может быть уменьшено или вместо этого предоставляется полная копия обновленного файла. Патчи позволяют изменять скомпилированные и машинные объектные программы, когда исходный код недоступен. Это требует глубокого понимания внутренней структуры объектного кода от человека, создающего патч, что затруднительно без тщательного изучения исходного кода. Пользователь, незнакомый с программой, к которой применяется патч, может установить его с помощью утилиты, созданной другим человеком. Даже при наличии исходного кода, патчи позволяют устанавливать небольшие изменения в объектную программу без необходимости повторной компиляции или сборки. Для незначительных изменений в программном обеспечении часто проще и экономичнее распространять патчи среди пользователей, чем перераспространять перекомпилированную или пересобранную программу. Хотя патчи предназначены для исправления проблем, плохо разработанные патчи иногда могут приводить к новым проблемам (см. регрессии программного обеспечения). В некоторых случаях обновления могут намеренно нарушать функциональность или отключать устройство, например, путем удаления компонентов, на которые у поставщика обновлений больше нет лицензии. Управление патчами является частью управления жизненным циклом и представляет собой процесс разработки стратегии и плана применения патчей к определенным системам в заданное время.

Бинарные патчи

Патчи для проприетарного программного обеспечения обычно распространяются в виде исполняемых файлов, а не исходного кода. При запуске эти файлы загружают программу в память, которая управляет установкой кода патча в целевую программу (программы) на диске. Патчи для другого программного обеспечения обычно распространяются как файлы данных, содержащие код патча. Эти файлы считываются программой-утилитой для установки патча, которая выполняет установку. Эта утилита изменяет исполняемый файл целевой программы – машинный код программы – обычно путем перезаписи его байтов байтами, представляющими новый код патча. Если новый код помещается в пространство (количество байтов), занимаемое старым кодом, он может быть установлен путем непосредственной перезаписи старого кода. Это называется инлайн-патчем. Если новый код больше старого, утилита патчей добавляет одну или несколько записей загрузки, содержащие новый код, в объектный файл целевой программы, к которой применяется патч. При запуске пропатченной программы выполнение перенаправляется на новый код с помощью инструкций ветвления (переходов или вызовов), заменяющих место в старом коде, где требуется новый код. На ранних 8-битных микрокомпьютерах, например Radio Shack TRS 80, операционная система включала утилиту PATCH/CMD, которая принимает данные патча из текстового файла и применяет исправления к исполняемым бинарным файлам целевой программы. Код патча должен иметь место в памяти для выполнения во время работы программы. Инлайн-патчи не представляют сложности, но когда требуется дополнительное пространство памяти, программисту приходится импровизировать. Естественно, если программист, создавший код, который нужно пропатчить, является автором патча, это проще. Опытные программисты заранее планируют такую необходимость, резервируя память для последующего расширения, оставляя её неиспользованной при создании финальной версии. Другим программистам, не участвовавшим в первоначальной реализации и желающим внести изменения позже, необходимо найти или освободить место для дополнительных байтов. Наиболее благоприятная ситуация – когда подлежащая патчингу подпрограмма является отдельным модулем. В этом случае программисту патча достаточно лишь скорректировать указатели или индикаторы длины, сообщающие другим компонентам системы о занимаемом модулем пространстве; затем он может заполнить это пространство памяти расширенным кодом патча. Если подпрограмма, которую нужно пропатчить, не существует как отдельный модуль памяти, программисту необходимо найти способы уменьшить размер подпрограммы, чтобы освободить достаточно места для расширенного кода патча. Типичные тактики включают сокращение кода путем поиска более эффективных последовательностей инструкций (или перепроектирование с использованием более эффективных алгоритмов), сжатие строк сообщений и других областей данных, вынос функций программы на внешние носители (например, на дисковые накладки) или удаление функций программы, которые считаются менее важными, чем изменения, устанавливаемые патчем. Небольшие патчи машинного кода в памяти можно применять вручную с помощью системной отладочной утилиты, такой как DDT для CP/M или DEBUG для MS DOS. Программисты, работающие в интерпретируемом BASIC, часто использовали команду POKE для изменения функциональности системной подпрограммы или самого интерпретатора.

Исходный код

Пэтчи могут также распространяться в виде изменений исходного кода. В этом случае патчи обычно представляют собой текстовые различия между двумя файлами исходного кода, называемые "диффами". Такие патчи часто возникают в проектах с открытым исходным кодом. В этих случаях разработчики ожидают, что пользователи самостоятельно скомпилируют новые или измененные файлы.

Большие пятна

Поскольку слово "patch" подразумевает небольшое исправление, для крупных исправлений может использоваться другая терминология. Объемные исправления или исправления, значительно изменяющие программу, могут распространяться как "service packs" (пакеты обновлений) или как "обновления программного обеспечения". Microsoft Windows NT и последующие версии (включая Windows 2000, Windows XP, Windows Vista и Windows 7) используют термин "service pack" (пакет сервисов). Исторически IBM использовала термины "FixPaks" и "Corrective Service Diskette" для обозначения подобных обновлений.

История

Исторически сложилось так, что поставщики программного обеспечения распространяли исправления на бумажной ленте или на перфокартах, ожидая, что получатель вырежет указанную часть исходной ленты (или набора карт) и вставит (отсюда и название) заменяющий фрагмент. Позже для распространения исправлений стали использовать магнитные ленты. Затем, после изобретения дисководов с возможностью смены носителей, исправления поставлялись разработчиками программного обеспечения на дискетах или, позднее, на CD-ROM по почте. С широким распространением доступа к Интернету конечные пользователи получили возможность загружать исправления с веб-сайта разработчика или через автоматические обновления программного обеспечения. Начиная с Mac OS 9 от Apple и Windows ME от Microsoft, операционные системы для персональных компьютеров приобрели возможность автоматического получения обновлений программного обеспечения через Интернет. Компьютерные программы часто могут координировать применение исправлений для обновления целевой программы. Автоматизация упрощает задачу для конечного пользователя: ему нужно лишь запустить программу обновления, после чего она обеспечит полное и корректное обновление целевой программы. Сервисные пакеты для Microsoft Windows NT и последующих версий, а также для многих коммерческих программных продуктов используют подобные автоматизированные стратегии. Некоторые программы могут самостоятельно обновляться через Интернет, практически не требуя вмешательства пользователя. Обслуживание серверного программного обеспечения и операционных систем часто осуществляется таким образом. В ситуациях, когда системные администраторы управляют несколькими компьютерами, такая автоматизация помогает поддерживать единообразие. Применение исправлений безопасности обычно происходит именно таким образом. С появлением носителей большего объема и более высокой пропускной способности Интернета стало обычным практикой заменять целые файлы (или даже все файлы программы) вместо изменения существующих файлов, особенно для небольших программ.

Применение

Размер патчей может варьироваться от нескольких байтов до сотен мегабайт; таким образом, более значительные изменения подразумевают больший размер, хотя это также зависит от того, включает ли патч целые файлы или только измененные части файлов. В частности, патчи могут становиться довольно большими, когда изменения добавляют или заменяют не-программные данные, такие как графические и звуковые файлы. Такие ситуации часто возникают при обновлении компьютерных игр. По сравнению с первоначальной установкой программного обеспечения, применение патчей обычно не занимает много времени. В случае операционных систем и серверного программного обеспечения патчи играют особенно важную роль в устранении уязвимостей в системе безопасности. Некоторые критические патчи связаны с проблемами драйверов. Для применения патчей может потребоваться предварительная установка других патчей, либо одновременное обновление нескольких независимых компонентов программного обеспечения. Для упрощения обновлений операционные системы часто предоставляют автоматические или полуавтоматические средства обновления. Полностью автоматические обновления не получили широкого распространения в корпоративной среде, отчасти из-за вышеупомянутых сбоев, но также и из-за опасений администраторов, что разработчики программного обеспечения могут получить неограниченный контроль над их компьютерами. Системы управления пакетами могут предлагать различные уровни автоматизации патчей. Использование полностью автоматических обновлений стало гораздо более распространенным на потребительском рынке, во многом благодаря тому, что Microsoft Windows добавила поддержку этой функции, а Service Pack 2 для Windows XP (выпущенный в 2004 году) включил ее по умолчанию. Осторожные пользователи, особенно системные администраторы, предпочитают откладывать установку патчей до тех пор, пока не смогут убедиться в стабильности исправлений. Microsoft (W)SUS поддерживает такую возможность. В случаях с крупными патчами или значительными изменениями разработчики часто ограничивают доступ к патчам квалифицированными специалистами для бета-тестирования. Применение патчей к прошивке представляет собой особые трудности, поскольку часто требует предоставления полностью новых образов прошивки, а не только внесения изменений в предыдущую версию. Патч обычно состоит из образа прошивки в виде бинарных данных, а также специальной программы, предоставляемой поставщиком, которая заменяет предыдущую версию новой версией; обновление BIOS материнской платы является примером распространенного патча прошивки. Любая неожиданная ошибка или прерывание во время обновления, например, отключение электроэнергии, может привести к неработоспособности материнской платы. Производители материнских плат могут предусмотреть механизмы защиты от серьезных повреждений; например, процедура обновления может создавать и сохранять резервную копию прошивки для использования в случае обнаружения повреждения основной копии (обычно с использованием контрольной суммы, такой как CRC).

Видеоигры

Видеоигры получают патчи для исправления проблем совместимости после первоначального выпуска, как и любое другое программное обеспечение, но они также могут применяться для изменения правил игры или алгоритмов. Эти патчи могут быть вызваны обнаружением эксплойтов в многопользовательском игровом процессе, которые можно использовать для получения несправедливого преимущества над другими игроками. Часто добавляются новые функции и изменения в геймплее. Такие патчи распространены в шутерах от первого лица с многопользовательским режимом, а в MMORPG, которые обычно очень сложны и содержат большое количество контента, почти всегда в значительной степени полагаются на патчи после первоначального релиза, где патчи иногда добавляют новый контент и способности для игроков. Поскольку баланс и честность игры для всех игроков MMORPG могут быть серьезно нарушены за короткое время из-за эксплойта, серверы MMORPG иногда отключаются с небольшим предупреждением для применения критического патча с исправлениями. Иногда компании выпускают игры, зная о наличии в них ошибок. В 1994 году Scorpia из Computer Gaming World осудила "компании – их слишком много, чтобы перечислить – которые выпускают некачественную продукцию, зная, что смогут обойтись патчами и обновлениями, и превращают своих клиентов в платных тестировщиков".

В разработке программного обеспечения

Иногда патчи становятся обязательными для исправления проблем с библиотеками или частями исходного кода часто используемых программ или программ, находящихся на стадии поддержки. Это обычно происходит в очень крупных программных проектах, но редко в проектах небольшого масштаба. В проектах с открытым исходным кодом авторы часто получают патчи, или множество людей публикуют патчи, которые исправляют конкретные проблемы или добавляют определенные функции, например, поддержку локальных языков, не входящих в локализацию проекта. Примером является ранняя разработка ядра Linux (известного публикацией своего полного исходного кода), где Линус Торвальдс, оригинальный автор, получил сотни тысяч патчей от множества программистов для применения к своей первоначальной версии. Apache HTTP Server изначально развивался как набор патчей, которые Брайан Бехлендорф собрал для улучшения NCSA HTTPd, отсюда и название, намекающее на то, что это коллекция патчей ("собранный из заплаток сервер"). В разделе часто задаваемых вопросов на официальном сайте проекта указано, что название "Apache" было выбрано в знак уважения к индейскому племени апачи. Однако объяснение "собранный из заплаток сервер" изначально было дано на веб-сайте проекта.

Замедление

Обновление быстрого исправления или обновление QFE (QFE update) — это единый кумулятивный пакет, содержащий информацию (часто в виде одного или нескольких файлов), используемую для устранения проблемы в программном продукте (то есть программной ошибки). Как правило, обновления быстрого исправления выпускаются для решения конкретной проблемы, возникшей у пользователя. Компания Microsoft ранее использовала этот термин, но отказалась от него в пользу новой терминологии: General Distribution Release (GDR) и Limited Distribution Release (LDR). Однако компания Blizzard Entertainment определяет обновление быстрого исправления как «изменение в игре, которое признано достаточно критичным, чтобы его нельзя было отложить до следующего регулярного обновления контента».

Точка выпуска

Точечный релиз — это незначительный выпуск программного проекта, предназначенный в основном для исправления ошибок или небольших улучшений, а не для добавления существенных новых функций. Часто количество ошибок превышает возможности исправления в рамках одного крупного или минорного релиза, что обуславливает необходимость выпуска точечного релиза.

Временная поправка программы

Временное исправление программы или временное исправление продукта (PTF), в зависимости от даты выпуска, является стандартной терминологией IBM для отдельного исправления ошибки или группы исправлений, распространяемых в форме, готовой к установке для заказчиков. PTF иногда называли «ZAP». Заказчики порой в шутку расшифровывают этот акроним как «постоянное временное исправление», а более практично – «вероятно, это исправляет», поскольку у них есть возможность сделать PTF постоянной частью операционной системы, если исправление решает проблему.

Защитные патчи

Поправка безопасности – это изменение, применяемое к ресурсу для устранения слабости, описанной уязвимостью. Данное корректирующее действие предотвращает успешную эксплуатацию и устраняет или снижает способность угрозы использовать конкретную уязвимость в ресурсе. Управление исправлениями является частью управления уязвимостями – циклического процесса выявления, классификации, устранения и смягчения уязвимостей. Исправления безопасности – основной способ устранения уязвимостей в программном обеспечении. В настоящее время Microsoft выпускает исправления безопасности раз в месяц, а другие операционные системы и программные проекты имеют команды безопасности, занимающиеся выпуском наиболее надежных исправлений как можно скорее после объявления об уязвимости. Исправления безопасности тесно связаны с практикой ответственного раскрытия информации. Эти исправления безопасности критически важны для обеспечения непрерывности бизнес-процессов. В 2017 году компании подверглись атаке программы-вымогателя WannaCry, которая шифровала файлы в определенных версиях Microsoft Windows и требовала выкуп в биткоинах. В ответ на это Microsoft выпустила исправление, блокирующее запуск программы-вымогателя.

Сервисный пакет

Сервисный пакет (SP) или пакет функций (FP) представляет собой набор обновлений, исправлений или улучшений для программного обеспечения, поставляемый в виде единого устанавливаемого пакета. Компании часто выпускают сервисный пакет, когда количество отдельных патчей для данной программы достигает определенного (произвольного) лимита, или когда выпуск программного обеспечения стабилизируется и остается небольшое количество известных проблем, выявленных на основе отзывов пользователей и систем отслеживания ошибок, таких как Bugzilla. Для крупных программных приложений, таких как офисные пакеты, операционные системы, системы управления базами данных или сетевое управление, выпуск сервисного пакета в течение первого или двух лет после релиза продукта – обычная практика. Установка сервисного пакета проще и менее подвержена ошибкам, чем установка множества отдельных патчей, особенно при обновлении нескольких компьютеров по сети, где использование сервисных пакетов широко распространено.

Неофициальные патчи

Неофициальный патч — это обновление для программы, созданное сторонними разработчиками, а не её оригинальным автором. Подобно официальному обновлению, он исправляет ошибки или устраняет недостатки. Примером могут служить исправления безопасности, выпущенные специалистами в этой области, когда официальное обновление от разработчиков программного обеспечения задерживается. Другой пример — неофициальные патчи, созданные сообществом игроков для видеоигр, поддержка которых прекращена.

Обезьяны

Monkey patching означает расширение или модификацию программы локально, затрагивая только текущий экземпляр программы.

Горячая заклеивание

Горячее исправление, также известное как живое исправление или динамическое обновление программного обеспечения, — это применение исправлений без остановки и перезапуска системы или затронутой программы. Это позволяет решить проблемы, связанные с недоступностью предоставляемых системой или программой услуг. Данный метод может использоваться для обновления ядра Linux без остановки системы. Исправление, которое можно применить таким образом, называется горячим исправлением или живым исправлением. Это становится распространенной практикой в сфере мобильных приложений. Компании, такие как Rollout.io, используют метод swizzling для доставки горячих исправлений в экосистему iOS. Другой метод горячего исправления приложений iOS — JSPatch. Облачные провайдеры часто используют горячее исправление, чтобы избежать простоев для клиентов при обновлении базовой инфраструктуры.

Слипстриминг

В вычислительной технике, слипстриминг — это процесс интеграции обновлений (включая сервисные пакеты) в установочные файлы исходного приложения, что позволяет выполнить прямую установку обновленной версии. Слипстриминг требует первоначальных затрат времени и усилий, но в долгосрочной перспективе может значительно сэкономить время (а, следовательно, и средства). Это особенно важно для администраторов, отвечающих за управление большим количеством компьютеров, где обычно для установки операционной системы на каждый компьютер используется исходный носитель с последующим обновлением после завершения установки. Это занимает гораздо больше времени, чем начать с более актуального (слипстримированного) источника и установить лишь несколько обновлений, не включенных в него. Однако не все обновления можно применить таким образом, и одним из недостатков является то, что если будет установлено, что определенное обновление вызывает проблемы, его нельзя будет удалить без использования оригинального, не слипстримированного установочного носителя.

Системы обновления программного обеспечения

Системы обновления программного обеспечения позволяют пользователям и разработчикам управлять обновлениями. Во время киберпандемии Petya в 2017 году, как сообщается, система обновления финансового программного обеспечения "MeDoc" была скомпрометирована для распространения вредоносного ПО через обновления. На Tor Blog эксперт по кибербезопасности Майк Перри утверждает, что детерминированные, распределенные сборки, вероятно, являются единственным способом защиты от вредоносных программ, атакующих процессы разработки и сборки программного обеспечения, чтобы заразить миллионы устройств в одном, официально подписанном и мгновенном обновлении. Менеджеры обновлений также позволяют оперативно и широко распространять обновления безопасности. Менеджеры обновлений Linux, такие как Synaptic, позволяют пользователям обновлять всё установленное на их компьютере программное обеспечение. Приложения, такие как Synaptic, используют криптографические контрольные суммы для проверки исходных/локальных файлов перед их применением, обеспечивая защиту от вредоносного ПО.