CVE status and security fixes
Maintained by BW-Tech GmbH. As of October 28, 2026, owncloud.online 11.0.25.
The tables list the vulnerabilities with a CVE ID that owncloud.online has fixed, and the version that first contains each fix. They serve as evidence in security reviews and explain why scanners still flag some of the bundled libraries. Security fixes without a CVE ID are listed in the CHANGELOG under "Security".
Code base
The code base contains all security fixes of the upstream project up to February 17, 2026. Later fixes from upstream are reviewed regularly and backported one by one. In the Git history, the commit message names the origin ("cherry picked from commit …"). The backported fixes are listed under Backported fixes in the code.
composer audit --locked reports no vulnerabilities for the PHP dependencies
of 11.0.25 (checked on October 28, 2026, for the core and the oco_mcp and
market apps). The same check runs in CI for every code change on the main
branch and in every pull request, and stops the build if it finds anything.
PHP dependencies
| CVE | Component | Severity | Fixed in | owncloud.online since |
|---|---|---|---|---|
| CVE-2026-40194 | phpseclib/phpseclib | — | 3.0.52 | 11.0.0 |
| CVE-2026-45065 | symfony/routing | — | 5.4.52 / 6.4.40 / 7.4.12 | 11.0.3 (routing 7.4.13) |
| CVE-2026-48784 | symfony/routing (encoding in UrlGenerator) | — | 7.4.13 | 11.0.3 |
| CVE-2026-45067 | symfony/mime (CRLF and SMTP command injection) | high | 8.0.13 | 11.0.3 |
| CVE-2026-45070 | symfony/mime (header injection) | medium | 8.0.13 | 11.0.3 |
| CVE-2026-45068 | symfony/mailer (argument injection with sendmail) | medium | 7.4.12 | 11.0.3 |
| CVE-2026-49214 | guzzlehttp/psr7 (CRLF and header injection) | — | 2.11.0 | 11.0.3 |
| CVE-2026-48998 | guzzlehttp/psr7 (host confusion) | — | 2.11.0 | 11.0.3 |
| CVE-2026-55767 | guzzlehttp/guzzle (a cookie domain consisting of only a dot matches all hosts) | medium | 7.12.1 | 11.0.8 |
| CVE-2026-55568 | guzzlehttp/guzzle (HTTPS proxy silently downgraded to cleartext) | medium | 7.12.2 | 11.0.8 |
| CVE-2026-55766 | guzzlehttp/psr7 (CRLF injection in the HTTP start line) | medium | 2.12.1 | 11.0.8 |
| GHSA-m557-wrgg-6rp4 | phpseclib/phpseclib (SSRF through the X.509 AIA extension, no CVE ID) | medium | 3.0.54 | 11.0.8 |
| CVE-2026-69246 | guzzlehttp/guzzle (non-canonical host bypasses host-based checks) | high | 7.15.2 | 11.0.12 |
| CVE-2026-69245 | guzzlehttp/guzzle (non-canonical cookie domain keeps its subdomain scope) | medium | 7.15.2 | 11.0.12 |
| CVE-2026-53965 | mcp/sdk in the oco_mcp app (buffer in the SSE transport grows without limit; GHSA-7m52-jw36-44r3) |
— | 0.7.1 | 11.0.14 |
| CVE-2026-84308 | phpseclib/phpseclib (X25519 not constant-time) | medium | 3.0.57 | 11.0.21 |
"—" means that no severity is given. 11.0.25 ships guzzle 7.15.2, psr7 2.13.0, phpseclib 3.0.57, symfony/routing 7.4.13, symfony/mime 8.0.15, and symfony/mailer 7.4.15.
PHP itself
CVE-2026-109618 and CVE-2026-109619 affect the PHP interpreter, not the owncloud.online code. They let attackers run code on the server without logging in. For PHP 8.4, they are fixed in 8.4.27 and later. Since 11.0.24, owncloud.online reports an affected PHP version in the setup warnings, see Security and setup warnings. Install the update itself through your system's package manager.
Backported fixes in the code
These fixes come from the upstream project. Most of them close security holes; some fix operational bugs.
| Fix | owncloud.online since |
|---|---|
| Hardened resolution of remote services | 11.0.0 |
| SVG content is sanitized before ImageMagick processes it | 11.0.0 |
| No empty tokens when pairing trusted servers (federation) | 11.0.0 |
| IDOR in the WebDAV API for comments | 11.0.3 |
| App configuration through the AppConfigController readable by full administrators only | 11.0.3 |
| Correct user ID when the email address changes, including a follow-up fix | 11.0.3 |
| Alias for storage backend identifiers | 11.0.3 |
| PHP 8 deprecation warnings in the federation DbHandler and the encryption wrapper | 11.0.3 |
| Federation with instances in subdirectories | 11.0.3 |
htaccess.RewriteBase blocked API requests for files with extensions |
11.0.3 |
core/signature.json removed (see Integrity check) |
11.0.3 |
| The login form no longer reveals whether an account exists | 11.0.12 |
Search result excerpts (search-highlights) are returned encoded |
11.0.13 |
| Shares that only allow uploading could be listed through WebDAV | 11.0.20 |
occ config:system:set and config:app:set printed secrets in plain text |
11.0.20 |
| The bitmap preview released the file pointer only on success | 11.0.20 |
Login form
The form derived the password reset link from canChangePassword(). Whether
the link appeared therefore revealed whether an account existed. This part of
the fix is backported; the link now appears the same way for every login
attempt.
The second part of the upstream fix was deliberately left out. It resolves the
login name through userManager->get()->getUserName(). Because
AccountMapper::getByUid() searches case-insensitively, the form would return
the canonical spelling for existing accounts and the raw input for unknown
ones (?user=fRANK gives frank or fRANK). That would be a new, cheaper way
to guess accounts: a single GET request without a login that brute-force
protection does not cover.
Search result excerpts
FilesSearchReportPlugin returned the WebDAV property search-highlights
unchanged from the search result. The excerpt is built from the file
content and deliberately carries markup (line breaks become <br/>). A
client that renders it as HTML therefore executed injected markup: stored XSS
through shared file content.
The server now encodes the excerpt first with
htmlspecialchars(..., ENT_QUOTES, 'UTF-8') and only then replaces the line
breaks, so the intended <br/> survives. The order matters. The path only
becomes active with a search provider that returns excerpts. owncloud.online
does not ship one, but the vulnerable code was present.
Regression test: FilesSearchReportPluginTest::testOnReportEncodesHighlights.
Frontend libraries
The frontend libraries are committed to the repository under core/vendor,
including the fixes, and shipped exactly as committed. The fixes therefore
persist across updates.
| Library | Version | CVE | Status | owncloud.online since |
|---|---|---|---|---|
| jQuery | 2.1.4 | CVE-2020-11022, CVE-2020-11023 | fixed: the self-closing tag expansion (rxhtmlTag) in core/vendor/jquery/dist/jquery.js and jquery.min.js is neutralized, as in the jQuery 3.5.0 fix (htmlPrefilter); API-compatible |
11.0.8 |
| jQuery UI | 1.10.0 | CVE-2016-7103 | fixed: closeText is treated as text on both paths, when the title bar is built and when the option is set later |
11.0.14 |
| jQuery UI | 1.10.0 | CVE-2021-41182, CVE-2021-41183, CVE-2021-41184 | fixed: the fixes from jQuery UI 1.13.0 are backported, also in the datepicker override in core/js/js.js |
11.0.20 |
| Select2 | 3.5.4 | CVE-2016-10744 | fixed: a custom formatter may only return DOM; a string is escaped (the same rule as in Select2 4.0.6 and later). This also covers third-party extensions | 11.0.20 |
| Bootstrap | 3.4.1 | — | 3.4.1 is the security release of the 3.x line (it fixes CVE-2019-8331, among others). The line no longer receives updates | — |
The version numbers stay the same. Scanners that judge by version number will therefore keep reporting the CVEs, even though the holes are closed.
jQuery UI
The three vulnerabilities from 2021 concern options of the datepicker and the position utility. The shipped code sets none of them: the datepicker is called only with format and date range options, and the position utility not at all. That did not apply to third-party extensions, which was the remaining risk. The fixes from jQuery UI 1.13.0 are therefore backported:
- CVE-2021-41182 (
altField) and CVE-2021-41184 (position({of})): Both options are meant as selectors.$(x), however, interprets a string that starts with<as markup and builds elements from it. Both places now go through$(document).find(x), which always treats a string as a selector, word for word as in 1.13.0. A string that is not a valid selector now throws an error instead of silently building an element. 1.13 behaves the same way. - CVE-2021-41183 (text options of the datepicker): The datepicker builds
its markup as a string and inserted
prevText,nextText,currentText,closeText,weekHeader,appendText,buttonText, the day and month names, the year suffix, and the return value ofcalculateWeekraw. All of them are now escaped, including the single quote. The templates write their attributes in single quotes (title='…'), so escaping double quotes alone would not be enough.
The bundled jQuery UI language files write prevText as <Zurück, with
an HTML entity. After escaping, the entity would appear literally. That is
not a problem here, because these files are never loaded
(core/js/core.json lists only jquery-ui.custom.min.js). Month and day names
come from the owncloud.online translation and are plain text.
Moving to jQuery UI 1.13 is not backward compatible: button and buttonset
are dropped there in favor of controlgroup, and tabs changes. The library
therefore keeps the version number 1.10.0.
Select2
Select2 inserted the return value of formatResult and formatSelection
raw into the result list (select2.js:1123, :2650, :3254), whether or
not escapeMarkup was turned off. What mattered was what the formatters
returned.
The hole is closed where the markup is inserted, with the same rule that
Select2 applies from 4.0.6 on: where all options come together (prepareOpts), a formatter
passed in by the caller is wrapped. If it returns a DOM element or a jQuery
object, that passes through unchanged. Code that builds its markup through the
DOM has already set the external data as text. If it returns a string, the
string is escaped. The built-in formatters are left alone; they escape on their
own and need their highlighting as markup. This also protects
third-party extensions.
The six formatters in the code base (systemtagsfilelist.js,
systemtagsinputfield.js, settings/js/settings.js,
files_external/js/settings.js) now return jQuery objects instead of HTML
strings. That is also the only form in which Select2 4.x still accepts markup.
The three escapeMarkup: m => m overrides are no longer needed and have been
removed.
Moving to Select2 4.x changes the API in several places (templateResult,
ajax.processResults, initSelection, .select2('val')). The library
therefore keeps the version number 3.5.4.
Browser test
make test-js-browser tests both fixes in a real Chromium, each against the
normal and the minified version of the library
(tests/js/jquery_ui_xss_test.js with 56 checks,
tests/js/select2_xss_test.js with 26 checks). A datepicker whose text
options are set to <img src=x onerror=…>, and a tag with that name, appear as
text. No element is created, and nothing runs. altField and
position({of}) with the same string are rejected. In the cross-check against
the unmodified library, the injected code actually runs
(window.__xss === 1).
The tests also check that the libraries otherwise work unchanged: for
jQuery UI, the datepicker with custom month and day names, position with a
selector, and tabs, button, buttonset, progressbar, autocomplete,
draggable, and droppable, the widgets the product actually uses.
Note for developers
If you build from source: make clean-nodejs-deps (and therefore
make clean) deletes core/vendor. A rebuild through yarn afterwards
fetches the libraries without these fixes. The make target warns about this.
Restore core/vendor from the repository instead.
Checking it yourself
You can check the dependencies of a release against the known security
advisories with Composer. composer.json and composer.lock are not part of
the release package, but they are in the repository under the version tag:
mkdir /tmp/oco-audit && cd /tmp/oco-audit
curl -fLO https://raw.githubusercontent.com/BWTECH-github/owncloud.online/v11.0.25/composer.json
curl -fLO https://raw.githubusercontent.com/BWTECH-github/owncloud.online/v11.0.25/composer.lock
composer audit --locked
The expected output is "No security vulnerability advisories found." The same
works for the oco_mcp app with the files under apps/oco_mcp/. The versions
actually installed on an instance are listed in
lib/composer/composer/installed.json.