Hub managers

Security questions

Answers to the questions hub managers ask most often about the CMS side of security. Questions about the host underneath the hub belong in Operating system hardening.

Does an advisory for another content management system apply here?

Usually not, but check each one rather than assuming.

Some naming in this tree is shared with other PHP content management systems: language keys beginning J, the #__ table-prefix placeholder, and com_ component directories. The running code is Hubzero's own. The application object, the request and response objects, the session handler, the user object, the registration flow, the router, the database layer, and the plugin and module systems are all in core/libraries/Hubzero, and the components under core/components are written against them.

So an advisory for another project rarely names code a hub actually runs. It also means you cannot dismiss one on the strength of a version number: read what the advisory describes and look for the same pattern here. Hubzero tracks no other project's releases and receives no other project's security patches, so nothing arrives automatically.

Where does the CMS record failed logins?

Two places, and they hold different things.

/var/log/hubzero/cmsauth.log is a text log. Every line is a timestamp in Y-m-d H:i:s followed by a message, with nothing between them but a space.

System - HUBzero writes the line most people mean by "a failed login". It is the submitted username (stripped to A-Z 0-9 _ . -, or [unknown]), the remote address, and the word invalid:

2026-09-09 14:22:31 jdoe 203.0.113.7 invalid

The same plugin writes <username> <address> detect when it recognises its tracking cookie. System - Log writes a second, differently shaped line for the same failure — the authentication type, the word FAILURE, and the plugin's error message, with the username appended in quotes only when its Log user names parameter is on. It carries no address.

The log directory is /var/log/hubzero when that directory exists, and the log_path from Site > Global Configuration > System otherwise. See LogServiceProvider for the three loggers the CMS registers: debug (cmsdebug.log), auth (cmsauth.log), and spam (cmsspam.log). Only the auth logger uses the bare %datetime% %message% format; the other two use Monolog's default line format.

The #__users_log_auth database table holds a structured record per attempt, with username, ip, status and logged columns. The CMS reads that table, not the text log, when it decides whether an account or an address has crossed a threshold. See CMS-controlled Fail2Ban jail.

Does the CMS scan uploads for viruses?

Yes, wherever a component calls Filesystem::isSafe() — support ticket attachments, group and project files, wiki and blog media, storefront images, and course media among them. The scan shells out to the command in the virus_scanner configuration key, which defaults to:

clamscan -i --no-summary --block-encrypted

virus_scanner has no field in Global Configuration; set it in configuration.php if you want a different command, for example clamdscan against a running daemon. A non-zero exit from the scanner rejects the file, so a scanner that is missing or whose daemon is down fails closed and logs the reason.

Installing and updating ClamAV itself is the system administrator's job.

Does the CMS set a Content-Security-Policy header?

Only if you enable System - Content Security Policy, which ships disabled. The plugin can run in report-only mode, enforcing mode, or both at once, and it sets base-uri, object-src, child-src, connect-src, default-src, font-src, form-action, frame-src, img-src, script-src and style-src from its own parameters. Its Mode defaults to Report only, which is where to start: the shipped script-src already includes 'unsafe-inline' and 'unsafe-eval', which much of the interface still needs, so an enforcing policy tightened from that default breaks screens.

It does set Referrer-Policy, without your doing anything: System - Referrer Policy ships enabled, with a policy of same-origin. See Security headers.

The parameters are listed in the system plugin reference.

A member is stuck on a "spam detected" page. How do I release them?

That is the System - Spamjail plugin. Clear the counter from Users > Members, open the member, and use Reset beside Lifetime Spam Incidents. The full procedure, including the per-session counter that clears itself, is in Spam.

Can I stop a specific address from reaching the hub?

Not from the CMS. The only address-level action Hubzero takes is handing an address to a Fail2Ban jail after too many accounts have been blocked from it, and even that only happens when you turn it on. Blocking, rate limiting at the network edge, and reputation-based blocklists are all the system administrator's tools.

Rewritten and checked against 2.4-main @ 35f103b1b3 on 2026-09-10.