01
Версии и восемь CVE
Проверены локальные архивы ZOO 3.3.37, 4.1.63 и 4.1.66, официальный changelog YOOtheme, публикация mySites.guru и записи CVE/NVD. Первые три проблемы исправлены в 4.1.64, ACL тегов — в 4.1.65, ещё четыре проблемы — в 4.1.66. Практическая рекомендация одна: для ветки 4.x устанавливать полный официальный пакет 4.1.66 или новее, а не промежуточный релиз.
Joomla 3: архив ZOO 4.1.66 прямо проверяет минимальную версию Joomla 3.7, содержит отдельные ветки совместимости для Joomla ниже 4.0 и исправляет MIME-проверку на Joomla ниже 4.4. То есть ZOO 4.1.66 технически рассчитан на Joomla 3.7+, но сама Joomla 3 снята с поддержки. Сначала staging и резервная копия.
Пакеты ZOO 3 без путаницы: в com_zoo_v3_for_joomla3/ лежат два самостоятельных ZIP. 01_standard_security_patch.zip сохраняет hardened comment output и администраторские frontend writes; 02_radical_no_comments_submissions.zip включает те же direct fixes/mitigations и дополнительно полностью отключает comments/submissions. Выбирать нужно ровно один; это не полный vendor-level backport ZOO 4.1.66.
Исторические ZOO 3 advisories без CVE: changelog YOOtheme указывает XSS fixes до 3.3.18, а Joomla Vulnerable Extensions List — SQL injection в 3.3.33, исправленный в 3.3.34. Поскольку patch baseline — 3.3.37, эти исправления уже входят в исходную версию и не являются отдельными payload текущего пакета.
Локальный каталог CVE на этом хостинге ещё не содержит часть новых записей. Статья использует зафиксированные публичные данные; обновите data/cves.json и data/tags.json штатным refresh-скриптом.
| CVE | Проблема | Fixed |
| CVE-2026-74803 | Неаутентифицированная загрузка произвольного файла через Image element; CVSS 10. | 4.1.64 |
| CVE-2026-74804 | SQL-инъекция в ItemController::element(); CVSS 9.3. | 4.1.64 |
| CVE-2026-75114 | Open redirect в twitterAuthenticate(); CVSS 5.1. | 4.1.64 |
| CVE-2026-76610 | Отсутствующая ACL-защита управления тегами; CVSS 6.9. | 4.1.65 |
| CVE-2026-76611 | Directory listing/path traversal через Gallery element; CVSS 6.9. | 4.1.66 |
| CVE-2026-76612 | Stored XSS через комментарии и пользовательские поля; CVSS 8.6. | 4.1.66 |
| CVE-2026-77028 | Reflected XSS и open redirect через submission redirect; CVSS 5.3. | 4.1.66 |
| CVE-2026-77029 | Отсутствующие CSRF-токены на изменяющих состояние действиях; CVSS 4.6. | 4.1.66 |
02
Что показало сравнение архивов
В packages/com_zoo версии 4.1.63 и 4.1.66 одинаково 2182 файла, но изменены 256: 238 PHP, 15 XML, SQL, README и checksums. Ещё 23 файла изменены в комплектных модулях и плагинах. Поэтому копирование двух-трёх PHP-файлов не эквивалентно официальному обновлению.
В ZOO 3.3.37 и 4.1.63 подтверждены одинаковые уязвимые конструкции: доверие к multipart Content-Type, сырые filter_type/type_filter в SQL, непроверенный Twitter referer, слабая нормализация пути Gallery, base64 custom redirect без same-origin проверки и state-changing действия без токенов.
ZOO 4.1.66 определяет MIME по содержимому, проверяет расширение, кавычит type filters и имена сортировки, ограничивает пути корнем Gallery, проверяет internal redirect, добавляет ACL/CSRF и экранирует вывод в component templates, модулях и плагинах.
03
Загрузка и SQL-инъекция
Старый Image element передаёт клиентский MIME в валидатор. Исправление должно одновременно определять MIME по временному файлу и сверять расширение с allow-list Joomla Media. Один только makeSafe() не превращает shell.php в изображение.
1$file = $this->app->validator
2 ->create('file', array('mime_type_group' => 'image', 'max_size' => $max_upload_size))
3 ->addMessage('mime_type_group', 'Uploaded file is not an image.')
4 ->clean($userfile);
В SQL-контроллере исправляются не только filter_type/type_filter, но и направление/имя сортировки. Каждый тип должен пройти Quote(), имя столбца — quoteName(), направление допускает только asc или desc.
1diff --git a/com_zoo/site/controllers/item.php b/com_zoo/site/controllers/item.php
2@@ type filter branch
3 // type filter
4 if (!empty($this->type_filter)) {
5- $where[] = 'a.type IN ("' . implode('", "', $this->type_filter) . '")';
6- } else if (!empty($filter_type)) {
7- $where[] = 'a.type = "' . (string) $filter_type . '"';
8+ $quoted_types = array();
9+ foreach ((array) $this->type_filter as $type) {
10+ $quoted_types[] = $this->db->Quote((string) $type);
11+ }
12+ $where[] = 'a.type IN (' . implode(', ', $quoted_types) . ')';
13+ } else if (!empty($filter_type)) {
14+ $where[] = 'a.type = ' . $this->db->Quote((string) $filter_type);
15 }
04
Что добавилось в 4.1.66
- Gallery: нормализация пути больше не позволяет подняться выше корня, а выбранная директория проверяется по каноническому префиксу.
- Stored XSS: пользовательские значения экранируются в component templates и в комплектных модулях. Обновление не очищает уже сохранённый вредоносный HTML — комментарии и submitted items нужно проверить отдельно.
- Submission redirect: base64 destination декодируется и принимается только как internal URL.
- CSRF: токены добавлены в comment/submission/rating/download и административные state-changing действия.
- Дополнительное hardening: Download element применяет allow-list расширений, исправлена MIME-проверка на Joomla ниже 4.4, Twitter/Akismet переведены на корректную TLS-проверку.
05
Как использовать три patch-пакета
ZOO 4.1.63 на Joomla 3: предпочтительный путь — штатная установка полного ZOO 4.1.66. Delta-пакет patch_zoo_j3_zoo4 нужен только когда installer временно недоступен; он содержит все изменившиеся package-файлы 4.1.63→4.1.66 и должен накладываться только на неизменённый 4.1.63 после проверки SHA-256.
ZOO 3.3.37 на Joomla 3: откройте com_zoo_v3_for_joomla3/README_ru.txt (или английский README.txt) и выберите ровно один самостоятельный архив. Оба содержат direct fixes/mitigations по всем восьми CVE, но не являются полным vendor-level backport всех ZOO 4.1.66 output/state-changing изменений.
Стандартный вариант: com_zoo_v3_for_joomla3/01_standard_security_patch.zip. Для CVE-2026-74803/74804/75114/76610/76611 есть конкретные code-level backports; CVE-2026-76612 и CVE-2026-77029 имеют сильные mitigations, но не доказан полный охват каждого шаблона и state-changing action.
Радикальный вариант: com_zoo_v3_for_joomla3/02_radical_no_comments_submissions.zip. Он включает стандартные controls, а затем отключает comments/submissions, comment/submission controllers и view=submission. Это сильно сокращает публичную поверхность CVE-2026-76612/77029, но не очищает уже сохранённые вредоносные данные и не заменяет проверку остальных ZOO actions.
Если comments/submissions действительно не нужны, радикальный вариант предпочтительнее: меньше публичных code paths и проще operational verification. Обычные item/category страницы и JBZoo cart/payment не должны затрагиваться, но требуют staging regression test.
Оба ZIP содержат русские INSTALL_ru.txt и htaccess_recommended_ru.txt, английские версии документов и исходные SHA-256. Не накладывайте файлы вслепую на модифицированный JBZoo/ZOO: сначала сравните hashes, затем staging, PHP lint и функциональные сценарии.
06
.htaccess: только временный edge shield
Фрагмент ставится после RewriteEngine On и до Joomla SEF. Он блокирует подтверждённый Gallery callback, custom submission redirects, видимые SQLi-маркеры и direct execution в upload-каталогах. Он не может реализовать output escaping, ACL или динамический Joomla CSRF-токен.
1# Put after RewriteEngine On and before Joomla SEF rules.
2# Emergency containment only; install ZOO 4.1.66+ or the reviewed legacy patch.
3
4# CVE-2026-76611: disable the public Gallery directory callback.
5RewriteCond %{REQUEST_URI} !^/administrator(/|$) [NC]
6RewriteCond %{REQUEST_METHOD} POST [NC]
7RewriteCond %{QUERY_STRING} (^|&)option=com_zoo(&|$) [NC]
8RewriteCond %{QUERY_STRING} (^|&)task=callelement(&|$) [NC]
9RewriteCond %{QUERY_STRING} (^|&)method=dirs(&|$) [NC]
10RewriteRule ^ - [F,L]
11
12# CVE-2026-77028: disable custom base64 submission redirects.
13RewriteCond %{REQUEST_URI} !^/administrator(/|$) [NC]
14RewriteCond %{QUERY_STRING} (^|&)option=com_zoo(&|$) [NC]
15RewriteCond %{QUERY_STRING} (^|&)(controller|view|layout|task)=submission(&|$) [NC]
16RewriteCond %{QUERY_STRING} (^|&)redirect=[^&]+(&|$) [NC]
17RewriteCond %{QUERY_STRING} !(^|&)redirect=(mysubmissions|itemedit)(&|$) [NC]
18RewriteRule ^ - [F,L]
19
20# CVE-2026-74804: block visible SQLi markers in the affected type filters.
21RewriteCond %{REQUEST_URI} !^/administrator(/|$) [NC]
22RewriteCond %{QUERY_STRING} (^|&)option=com_zoo(&|$) [NC]
23RewriteCond %{QUERY_STRING} (^|&)(filter_type|type_filter)(\[|%5b|=)[^&]*(union([[:space:]]|%20|\+)+(all([[:space:]]|%20|\+)+)?select|%75%6e%69%6f%6e|information_schema|sleep([[:space:]]|%20|\+)*(\(|%28)|benchmark([[:space:]]|%20|\+)*(\(|%28)|load_file([[:space:]]|%20|\+)*(\(|%28)|(%27|')([[:space:]]|%20|\+)*(or|and|xor)([[:space:]]|%20|\+)+|--([[:space:]]|%20|\+|$)|%2d%2d|/\*|%2f%2a) [NC]
24RewriteRule ^ - [F,L]
25
26# CVE-2026-75114: refuse an external Twitter callback referer.
27RewriteCond %{REQUEST_URI} !^/administrator(/|$) [NC]
28RewriteCond %{QUERY_STRING} (^|&)option=com_zoo(&|$) [NC]
29RewriteCond %{QUERY_STRING} (^|&)task=comment(\.|%2e)twitterAuthenticate(&|$) [NC]
30RewriteCond %{QUERY_STRING} (^|&)referer=(https?://|//|%2f%2f) [NC]
31RewriteRule ^ - [F,L]
32
33# Deny direct execution in both known ZOO guest-upload directories.
34RewriteRule ^images/zoo/uploads/.*\.(php|php[0-9]|phtml|pht|phtm|phar|phps|shtml)(\..*)?$ - [F,L,NC]
35RewriteRule ^images/uploads/.*\.(php|php[0-9]|phtml|pht|phtm|phar|phps|shtml)(\..*)?$ - [F,L,NC]
В используемый upload-каталог добавьте отдельный defense-in-depth файл:
1# Place this same file in images/zoo/uploads/.htaccess
2# or in the legacy images/uploads/.htaccess.
3Options -Indexes -ExecCGI
4
5# Запрет выполнения PHP и других скриптов.
6<FilesMatch "\.(php|php[0-9]+|phtml|php3|php4|php5|phar|pl|py|jsp|asp|aspx|sh|cgi|shtml)$">
7 Require all denied
8</FilesMatch>
9
10# Отключить выполнение скриптов через MIME и обработчики Apache.
11RemoveHandler .php .phtml .php3 .php4 .php5 .phar .shtml
12RemoveType .php .phtml .php3 .php4 .php5 .phar .shtml
07
Что это означает для JBZoo
Все восемь записей называют продуктом YOOtheme ZOO. Отдельного подтверждённого CVE для JBZoo в проверенных источниках нет. Но JBZoo работает поверх ZOO, поэтому наличие JBZoo не изолирует уязвимый com_zoo. Проверяйте именно версию ZOO и сохраняйте JBZoo application files при обновлении.
Правила сохраняют статические assets /media/zoo/ и обычный JBZoo AJAX, но legacy lockdown может отключить гостевые загрузки, комментарии и custom submission redirect. Платежи, корзину, изображения и формы проверяйте на staging отдельно.
08
Порядок работ
- 1
Сохраните доказательства и backupФайлы, база, access/error logs, hashes и время изменения до любых замен.
- 2
Включите containmentRoot и nested .htaccess; на ZOO 3 временно отключите публичные submissions/comments.
- 3
Для ZOO 4 установите полный 4.1.66+Delta-патч — аварийный запасной путь, не замена vendor installer.
- 4
Для ZOO 3 примените legacy patch на stagingПосле этого планируйте миграцию: ветка 3.x остаётся неподдерживаемой.
- 5
Если comments/submissions не нужны — примените полный lockdownВыберите только один вариант, zoo3 или zoo4, затем проверьте 404/deny на comment/submission routes и отсутствие вывода mod_zoocomment.
- 6
Проверьте компрометациюUpload directories, неожиданные PHP-файлы, администраторов, scheduled tasks, секреты, комментарии и submitted items с HTML/JavaScript.
09
Приёмочные проверки
- Файл PHP с поддельным image Content-Type отклоняется; нормальные JPEG/PNG/GIF/WebP проходят.
- Обычные, пустые и многозначные type filters работают; SQL markers не меняют запрос.
- Gallery path с
../, encoded dot и обратным слешем не выходит из configured root.
- Внешний Twitter/submission redirect не принимается; internal redirect остаётся рабочим.
- State-changing URL без действительного token получает отказ.
- Сохранённые комментарии и пользовательские поля не исполняют HTML/JavaScript при выводе.
- JBZoo cart/payment/assets и administrator UI проходят отдельный regression smoke-test.
10
Первоисточники
JCVE агрегирует публичные данные и не заменяет официальный advisory, vendor update, WAF и incident response. Для ZOO 4.1.63 приоритет — полный официальный 4.1.66; legacy ZOO 3 patch остаётся аварийной мерой с функциональными ограничениями.