Введение
Компьютерная программа или файл, допустимый в нескольких языках программирования или форматах файлов. В информатике полиглотом называется компьютерная программа или скрипт (или другой файл), написанный в допустимом формате нескольких языков программирования или форматов файлов. Название было придумано по аналогии с многоязычием. Файл-полиглот создается путем объединения синтаксиса двух или более различных форматов. Если форматы файлов предназначены для компиляции или интерпретации как исходный код, файл можно назвать полиглотной программой, хотя форматы файлов и синтаксис исходного кода по сути являются потоками байтов, и использование этого общего принципа является ключевым в разработке полиглотов. Файлы-полиглоты имеют практическое применение в обеспечении совместимости, но также могут представлять угрозу безопасности при использовании для обхода проверки или эксплуатации уязвимости.
In computing, a polyglot is a computer program or script (or other file) written in a valid form of multiple programming languages or file formats. The name was coined by analogy to multilingualism. A polyglot file is composed by combining syntax from two or more different formats. When the file formats are to be compiled or interpreted as source code, the file can be said to be a polyglot program, though file formats and source code syntax are both fundamentally streams of bytes, and exploiting this commonality is key to the development of polyglots. Polyglot files have practical applications in compatibility, but can also present a security risk when used to bypass validation or to exploit a vulnerability.
История
Программы-полиглоты создавались как задачи и объекты для экспериментов в хакерской культуре, по крайней мере, с начала 1990-х годов. Заметный ранний пример, просто названный "полиглот", был опубликован в группе Usenet rec.puzzles в 1991 году, поддерживая 8 языков, хотя вдохновение для него были еще более ранние программы. В 2000 году программа-полиглот стала победителем Международного конкурса запутанного кода на C. В XXI веке программы и файлы-полиглоты привлекли внимание как механизм скрытого канала для распространения вредоносного ПО. Такие документы могут быть разобраны как HTML (который совместим с SGML), так и XML, и в обоих случаях создадут одну и ту же структуру DOM. Например, чтобы документ HTML5 соответствовал этим критериям, необходимо, чтобы он имел doctype HTML5 и был написан на корректном XHTML. Тот же документ затем может быть представлен как HTML или XHTML, в зависимости от поддержки браузера и типа MIME. Как указано в рекомендации по HTML-полиглотам, например, для добавления пустого текстового поля на страницу нельзя использовать `<textarea/>`, а необходимо использовать `<textarea></textarea>`.
Форматы композиции
Формат медицинской визуализации DICOM был разработан для обеспечения совместимости с файлами TIFF, что позволяет эффективно хранить одни и те же данные изображения в файле, который может быть интерпретирован как DICOM, так и TIFF-просмотрщиками.
Совместимость
Языки программирования Python 2 и Python 3 не разрабатывались с учетом совместимости друг с другом, однако синтаксис в них достаточно схож, что позволяет написать программу на Python, которая будет работать в обеих версиях.
Атака GIFAR
Graphics Interchange Format Java Archives (GIFAR) — это полиглотический файл, который одновременно является файлом формата GIF и JAR. Этот метод может быть использован для эксплуатации уязвимостей безопасности, например, путем загрузки GIFAR на веб-сайт, допускающий загрузку изображений (поскольку это валидный GIF-файл), и последующего выполнения Java-части GIFAR, как будто она является частью кода веб-сайта, доставляемого браузеру из того же домена. Уязвимость в Java была устранена в JRE 6 Update 11, CVE было опубликовано в декабре 2008 года. Возможность создания GIFAR обусловлена тем, что изображения GIF хранят свой заголовок в начале файла, а файлы JAR (как и любой формат, основанный на архиве ZIP) — свои данные в конце файла.
Связанная терминология
Полиглотное программирование — это практика создания систем с использованием нескольких языков программирования, не обязательно в одном файле. Полиглотная постоянная работа с данными — аналогичный подход, но применительно к базам данных.