Skip to content

refactor: PHP 8 modernization and WMI transport seam - #16

Draft
somethingwithproof wants to merge 10 commits into
Cacti:developfrom
somethingwithproof:refactor/php8-transport-modernization
Draft

refactor: PHP 8 modernization and WMI transport seam#16
somethingwithproof wants to merge 10 commits into
Cacti:developfrom
somethingwithproof:refactor/php8-transport-modernization

Conversation

@somethingwithproof

Copy link
Copy Markdown
Member

Draft. Stacked on #13 and #14 (both security). Merge order: #13, then #14, then this. The diff currently includes those two PRs; once they land I will rebase onto develop so this shows only the modernization. Do not merge before them.

Linux_WMI

  • Typed properties and method signatures; drop var, the no-op __destruct, and the dead $config write in exec().
  • Introduce a Wmi_Transport interface with Wmic_Shell_Transport as the default, injectable via the constructor. The wmic command construction and shell escaping move into the transport; Linux_WMI builds a Wmi_Request and delegates. This is Phase 1 of the CIM/PowerShell backend (Windows compatibility: server-on-Windows unsupported and modern Windows host auth #15): a second transport can be added without touching the parser.
  • decode() returns `` on a malformed blob instead of tripping a type error; the unserialize stays `allowed_classes => false` (annotated for semgrep).
  • Behaviour is unchanged: the injection test still passes and the parse contract (class / header / rows) is preserved by a fake transport in the same test path.

Whole plugin

  • Apply the checked-in .php-cs-fixer.php ruleset (short arrays, single-quoted literals, comment style, indentation). Mechanical; no logic change. strict_param does not alter the single-argument array_keys() calls.

Sets the effective PHP floor at 8.x (matches Cacti develop, PHP ^8.1). No schema or storage-format change.

Automated fixes:
- XSS: escape request variables in HTML value attributes
- SQLi: convert string-concat queries to prepared statements
- Deserialization: add allowed_classes=>false
- Temp files: replace rand() with tempnam()

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
- Change Dependabot ecosystem from npm to composer (PHP-only repo)
- Remove PHP from CodeQL paths-ignore so security PRs get analysis
- Remove committed .omc session artifacts, add .omc/ to .gitignore

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
Linux_WMI::clean() escaped the username, password, binary and command but left
the device hostname only trimmed and the query namespace untouched, so
getcommand() interpolated them raw into the wmic command line that exec() runs
on the Cacti server. A device-supplied hostname such as
  127.0.0.1; touch /tmp/pwned #
therefore ran a command on the poller.

Escape the hostname and namespace with cacti_escapeshellarg, and on Windows
strip the cmd.exe metacharacters (" & | ^ < > ( ) %) that cmd.exe interprets
despite quoting. A standalone regression test in tests/ verifies both.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
Escape account/query/tool output on render (html_escape/__esc), bind the
remaining WMI queries as prepared statements, and drop wmi_accounts.php and
wmi_tools.php from the Template Editor auth augment so credential management
and the live query tool stay behind the WMI Management realm.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
The default separator (|+|) contains pipe characters, so the unquoted
--delimiter=|+| made exec() split the command into a shell pipeline (exit
127, no data). Quote it in getcommand() while keeping the property raw for
the explode() in fetch(). issue#5

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
Type the properties and method signatures, replace var/sizeof, and move the
wmic command construction behind a Wmi_Transport interface (Wmic_Shell_Transport
by default, injectable) so a PowerShell/CIM backend can be added without
touching the parser. Behaviour and the shell-escaping guards are unchanged; the
existing injection test still passes.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
Short array syntax, single-quoted literals, comment style and indentation to
match the checked-in .php-cs-fixer.php. Mechanical only; no logic change.

Signed-off-by: Thomas Vincent <thomasvincent@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant