Skip to content

security: replace eval() in RPN binary math with safe dispatch (GHSA-vr4v-qvqm-gm9j) - #807

Open
bmfmancini wants to merge 3 commits into
developfrom
advisory-fix-eval-math
Open

security: replace eval() in RPN binary math with safe dispatch (GHSA-vr4v-qvqm-gm9j)#807
bmfmancini wants to merge 3 commits into
developfrom
advisory-fix-eval-math

Conversation

@bmfmancini

Copy link
Copy Markdown
Member

Security Fix — GHSA-vr4v-qvqm-gm9j

Fixes GHSA-vr4v-qvqm-gm9j

Summary

The thold_expression_math_rpn() function in thold_functions.php used PHP's eval() to evaluate binary arithmetic operations (line 378) during RPN expression parsing for threshold expressions.

Vulnerability Details

  • Rule: php:S1523 (SonarQube)
  • CWE: CWE-95 (Improper Neutralization of Directives in Dynamically Evaluated Code)
  • OWASP: A03:2021 - Injection
  • Severity: Critical
  • Location: thold_functions.php, line 378

Changes

Replaced eval() with a safe arithmetic dispatch function thold_rpn_math_binary() that uses a switch statement to perform binary math operations (+, -, *, /, %) without dynamic code execution.

Testing

  • PHP syntax check passes (php -l thold_functions.php)
  • All binary math operators covered: +, -, *, /, %
  • Division-by-zero protection preserved

Copilot AI lite review requested due to automatic review settings August 17, 2026 20:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

TheWitness
TheWitness previously approved these changes Aug 17, 2026

@somethingwithproof somethingwithproof left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs isolation and behavioral coverage before merge. #773 already replaces the same binary eval block, so merging both independently risks one implementation stomping the other. Rebase on the selected implementation, retain one safe dispatch, and add Cacti-Composer/Pest cases for operand order, + - * / % ^, 0/0, divide-by-zero, modulo-by-zero, and an invalid operator. The current implementation's default return of 0 silently masks an impossible operator, and all checks are red.

…1523)

Replace the eval()-based binary arithmetic evaluation at line 378
with a new thold_rpn_math_binary() helper function that uses a
switch statement for +, -, *, /, %, ^ operators.

The operator was already whitelisted via in_array(, , true)
and operands validated with is_numeric(), but removing eval() eliminates
the code injection risk entirely (CWE-95).

Addresses SonarQube finding: php:S1523 at thold_functions.php:378
@somethingwithproof

Copy link
Copy Markdown
Member

The focused tests and green CI are useful progress. Two blockers remain: #773 already changes this exact evaluator, so this must be rebased onto whichever implementation is selected; and the invalid/default path still returns numeric 0, converting an evaluator error into a plausible threshold value. Please make that path unambiguously fail closed and add divide-by-zero/modulo-by-zero coverage. Also split the shared workflow retry/matrix edits into one dedicated PR instead of repeating them across each security patch.

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.

4 participants