<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Argus Proof of Possession</title><link href="https://pop.argus-systems.ai/" rel="alternate"/><link href="https://pop.argus-systems.ai/feeds/all.atom.xml" rel="self"/><id>https://pop.argus-systems.ai/</id><updated>2026-06-14T00:00:00-07:00</updated><subtitle>Public Security Advisories</subtitle><entry><title>MongoDB - Pre-auth Remote ████ ████████████ out-of-bounds read</title><link href="https://pop.argus-systems.ai/advisory/adv-041.html" rel="alternate"/><published>2026-06-14T00:00:00-07:00</published><updated>2026-06-14T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-14:/advisory/adv-041.html</id><summary type="html">&lt;p&gt;See report digest.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Report digest&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="n"&gt;a3a54c36db743b91211cd7953a0af06d19788e3d3179490ff4e5ddf08ca3c74&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;adv&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;041&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;poc&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="advisories"/></entry><entry><title>OpenBSD - Remote Kernel PAP Authentication Bypass</title><link href="https://pop.argus-systems.ai/advisory/adv-038.html" rel="alternate"/><published>2026-06-12T00:00:00-07:00</published><updated>2026-06-12T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-12:/advisory/adv-038.html</id><summary type="html">&lt;p&gt;sppp_pap_input uses attacker-controlled length fields directly as bcmp comparison length, allowing zero-length authentication bypass.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;sppp_pap_input&lt;/code&gt; function in &lt;code&gt;sys/net/if_spppsubr.c&lt;/code&gt; uses the attacker-controlled &lt;code&gt;name_len&lt;/code&gt; and &lt;code&gt;passwd_len&lt;/code&gt; fields from the incoming PAP frame directly as the comparison length for &lt;code&gt;bcmp&lt;/code&gt; against configured credentials. Sending both as zero causes &lt;code&gt;bcmp&lt;/code&gt; to return 0 unconditionally, bypassing authentication entirely.&lt;/p&gt;
&lt;h2&gt;Details&lt;/h2&gt;
&lt;p&gt;The credential check compares the peer-supplied name and password against stored values using &lt;code&gt;bcmp(..., name_len)&lt;/code&gt; and &lt;code&gt;bcmp(..., passwd_len)&lt;/code&gt;. When &lt;code&gt;bcmp&lt;/code&gt; is called with length 0, it always returns 0 regardless of the buffer contents. The existing &lt;code&gt;&amp;gt; AUTHMAXLEN&lt;/code&gt; guard allows zero through, so a PAP Auth-Request with &lt;code&gt;name_len=0&lt;/code&gt; and &lt;code&gt;passwd_len=0&lt;/code&gt; passes validation and triggers a &lt;code&gt;PAP_ACK&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A secondary issue arises from the same root cause: supplying a &lt;code&gt;name_len&lt;/code&gt; larger than the allocated credential string causes &lt;code&gt;bcmp&lt;/code&gt; to read past the heap object, producing a kernel heap over-read.&lt;/p&gt;
&lt;h2&gt;Reachability&lt;/h2&gt;
&lt;p&gt;Both issues are reachable via the PPPoE data path (&lt;code&gt;pppoe_data_input&lt;/code&gt; → &lt;code&gt;sppp_input&lt;/code&gt; → &lt;code&gt;sppp_pap_input&lt;/code&gt;) on systems configured as a PAP authenticator. No credentials need to be known by the attacker.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;An attacker on the same network segment can authenticate to a PPPoE interface without knowing any configured credentials, establishing a full network-layer link. This enables traffic interception when OpenBSD acts as a PPPoE client with mutual authentication.&lt;/p&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2026-06-12 — Reported to OpenBSD with proof of concept&lt;/li&gt;
&lt;li&gt;2026-06-14 — Fix committed &lt;a href="https://github.com/openbsd/src/commit/076e2b1c1fc4ac0883a72d3544131ad5cee7adf8"&gt;openbsd/src@076e2b1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="auth"/><category term="kernel"/><category term="ppp"/><category term="pppoe"/></entry><entry><title>OpenBSD - Pre-auth Remote Kernel ███ Heap Over-Read</title><link href="https://pop.argus-systems.ai/advisory/adv-039.html" rel="alternate"/><published>2026-06-12T00:00:00-07:00</published><updated>2026-06-12T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-12:/advisory/adv-039.html</id><summary type="html">&lt;p&gt;See report digest.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Report digest&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;8283&lt;/span&gt;&lt;span class="n"&gt;dd68745507b7cea499def75301fbcdd0446b2e76210fc706456cf5855738&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;poc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="advisories"/></entry><entry><title>OpenBSD - Pre-auth Remote Kernel ████ Stack Disclosure</title><link href="https://pop.argus-systems.ai/advisory/adv-040.html" rel="alternate"/><published>2026-06-12T00:00:00-07:00</published><updated>2026-06-12T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-12:/advisory/adv-040.html</id><summary type="html">&lt;p&gt;See report digest.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Report digest&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;0107&lt;/span&gt;&lt;span class="n"&gt;e0e12dbd466d7c5077bfc51be4d5f80d52b0211c22367b003925ace8aaf8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;poc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;008&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;leak&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="advisories"/></entry><entry><title>MongoDB - Pre-auth Remote ████ ████████████ out-of-bounds read</title><link href="https://pop.argus-systems.ai/advisory/adv-036.html" rel="alternate"/><published>2026-06-11T00:00:00-07:00</published><updated>2026-06-11T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-11:/advisory/adv-036.html</id><summary type="html">&lt;p&gt;See report digest.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Report digest&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;127&lt;/span&gt;&lt;span class="n"&gt;de65d6b73d1c679187b5a3fb19a34f1ac80206fb1ec68189b3eb3b344efe5&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;poc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;029.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="advisories"/></entry><entry><title>MongoDB - Pre-auth Remote ████ ███████ out-of-bounds read</title><link href="https://pop.argus-systems.ai/advisory/adv-037.html" rel="alternate"/><published>2026-06-11T00:00:00-07:00</published><updated>2026-06-11T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-11:/advisory/adv-037.html</id><summary type="html">&lt;p&gt;See report digest.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Report digest&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fd77e56aac83a8a3d7a97d8eec8636008c739ec74b112b1e071682a58f7755a2  H1-report.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="advisories"/></entry><entry><title>IDOR in Report Test — Low-Privilege User Can Access Any User's Dashboard Reports</title><link href="https://pop.argus-systems.ai/advisory/adv-035.html" rel="alternate"/><published>2026-06-10T00:00:00-07:00</published><updated>2026-06-10T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-10:/advisory/adv-035.html</id><summary type="html">&lt;p&gt;The &lt;code&gt;report.test&lt;/code&gt; trapper endpoint allows an authenticated low-privilege user to supply an arbitrary &lt;code&gt;userid&lt;/code&gt; in the request body. The server creates a real session for that user, renders their dashboard as a PDF, and emails it to the attacker — with no check that the requested viewer identity matches the authenticated caller.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;report.test&lt;/code&gt; trapper endpoint accepts a &lt;code&gt;data.userid&lt;/code&gt; field that controls which user's dashboard is rendered. An authenticated User-role account can set this to any other user's ID, including the Super Admin. The report manager creates a live database session for the victim, renders their dashboard using the victim's cookie, and emails the resulting PDF to an attacker-controlled address. No authorization check is performed.&lt;/p&gt;
&lt;h2&gt;Affected Versions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Zabbix Server &lt;code&gt;8.0.0beta2&lt;/code&gt; (commit &lt;code&gt;31eccf9ddaf7adf129f9cd611c85b7451b188eb9&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Details&lt;/h2&gt;
&lt;p&gt;The call chain is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;trapper_server.c:68&lt;/code&gt; authenticates the caller via session ID and obtains the authenticated &lt;code&gt;user.userid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It calls &lt;code&gt;zbx_report_test(&amp;amp;jp_data, user.userid, &amp;amp;j)&lt;/code&gt;, passing the authenticated userid.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;report_protocol.c:370–394&lt;/code&gt; deserializes &lt;code&gt;data.userid&lt;/code&gt; from the attacker-controlled JSON into &lt;code&gt;viewer_userid&lt;/code&gt; (internally &lt;code&gt;access_userid&lt;/code&gt;). The authenticated userid is passed along but never compared to &lt;code&gt;access_userid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;report_manager.c:654&lt;/code&gt; calls &lt;code&gt;rm_session_start(manager, access_userid)&lt;/code&gt;, inserting a real row into the &lt;code&gt;sessions&lt;/code&gt; table for the victim user.&lt;/li&gt;
&lt;li&gt;The web service receives a rendering request with the victim's session cookie and fetches their dashboard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The fix is a single equality check — &lt;code&gt;access_userid == authenticated_userid&lt;/code&gt; — that is absent from the entire call chain.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;Any authenticated user can receive a PDF rendering of any other user's dashboards, including those of the Super Admin. Dashboards may display sensitive monitoring data, credentials stored as macros, or infrastructure topology. The attack is also a session-creation primitive: a live &lt;code&gt;sessions&lt;/code&gt; row is inserted for the victim user as a side effect.&lt;/p&gt;
&lt;h2&gt;Remediation&lt;/h2&gt;
&lt;p&gt;Enforce &lt;code&gt;access_userid == authenticated_userid&lt;/code&gt; before calling &lt;code&gt;rm_session_start&lt;/code&gt; in &lt;code&gt;report_manager.c&lt;/code&gt;. The authenticated userid is already present at the call site; the check is a single conditional.&lt;/p&gt;</content><category term="advisories"/><category term="idor"/><category term="access-control"/></entry><entry><title>SQL Injection via OAuth2 Token Refresh Response</title><link href="https://pop.argus-systems.ai/advisory/adv-034.html" rel="alternate"/><published>2026-06-09T00:00:00-07:00</published><updated>2026-06-09T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-09:/advisory/adv-034.html</id><summary type="html">&lt;p&gt;Zabbix server takes &lt;code&gt;access_token&lt;/code&gt; and &lt;code&gt;refresh_token&lt;/code&gt; values directly from an external OAuth server's HTTP response and interpolates them into a SQL UPDATE with no escaping. Stacked queries are enabled, giving an attacker who controls the token endpoint arbitrary SQL execution against the Zabbix database.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;When an Email media type is configured with OAuth2 authentication, Zabbix server automatically POSTs to the configured token endpoint to refresh expired tokens. The &lt;code&gt;access_token&lt;/code&gt; and &lt;code&gt;refresh_token&lt;/code&gt; values parsed from the JSON response are passed directly to &lt;code&gt;zbx_db_execute()&lt;/code&gt; with no escaping, allowing an attacker who controls the OAuth endpoint to inject arbitrary SQL.&lt;/p&gt;
&lt;h2&gt;Affected Versions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Zabbix Server &lt;code&gt;8.0.0beta2&lt;/code&gt; (commit &lt;code&gt;31eccf9ddaf7adf129f9cd611c85b7451b188eb9&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Details&lt;/h2&gt;
&lt;p&gt;The injection is in &lt;code&gt;src/libs/zbxalerter/oauth.c&lt;/code&gt;, &lt;code&gt;oauth_db_update()&lt;/code&gt;, lines 301–317. Both the &lt;code&gt;if&lt;/code&gt; and &lt;code&gt;else&lt;/code&gt; branches build the SQL string by interpolating &lt;code&gt;data-&amp;gt;access_token&lt;/code&gt; and &lt;code&gt;data-&amp;gt;refresh_token&lt;/code&gt; directly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;zbx_db_execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;update media_type_oauth set&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; access_token=&amp;#39;%s&amp;#39;,access_token_updated=&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ZBX_FS_TIME_T&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;access_expires_in=%d,refresh_token=&amp;#39;%s&amp;#39;,tokens_status=%hhu&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot; where mediatypeid=&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;ZBX_FS_UI64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;access_token_updated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;access_expires_in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;refresh_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tokens_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;mediatypeid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;These values are parsed directly from the OAuth server's JSON response (&lt;code&gt;oauth.c:248–264&lt;/code&gt;) with no call to &lt;code&gt;zbx_db_dyn_escape_string()&lt;/code&gt;, which is used everywhere else in the database layer for exactly this purpose.&lt;/p&gt;
&lt;p&gt;The MySQL connection is opened with &lt;code&gt;CLIENT_MULTI_STATEMENTS&lt;/code&gt;, so stacked queries are fully supported.&lt;/p&gt;
&lt;p&gt;The call chain is automatic and requires no user interaction:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;An alert is queued for an Email media type using OAuth2&lt;/li&gt;
&lt;li&gt;The alerter detects the access token is expired (&lt;code&gt;oauth.c:400&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Zabbix POSTs to the configured &lt;code&gt;token_url&lt;/code&gt; (&lt;code&gt;oauth.c:408&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The JSON response is parsed and tokens are stored as-is (&lt;code&gt;oauth.c:242–264&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;oauth_db_update()&lt;/code&gt; interpolates the unescaped values into SQL (&lt;code&gt;oauth.c:301–307&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Proof of concept: a hostile OAuth server returning a crafted &lt;code&gt;access_token&lt;/code&gt; with a stacked &lt;code&gt;INSERT&lt;/code&gt; statement created a backdoor admin account in the &lt;code&gt;users&lt;/code&gt; table without any Zabbix credentials.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;Arbitrary SQL execution as the Zabbix database user, triggerable by any party that can influence the response from the configured OAuth token endpoint (e.g., provider compromise, DNS hijack, network interception). Full database read/write on a monitoring server that already holds credentials and network reach into the monitored fleet.&lt;/p&gt;
&lt;h2&gt;Remediation&lt;/h2&gt;
&lt;p&gt;No fix — Zabbix declined to treat this as a security issue on the basis that configuring the OAuth media type requires administrator privileges. That reasoning gates the endpoint selection, not the content of the server's response.&lt;/p&gt;
&lt;p&gt;The one-line fix is to pass &lt;code&gt;access_token&lt;/code&gt; and &lt;code&gt;refresh_token&lt;/code&gt; through &lt;code&gt;zbx_db_dyn_escape_string()&lt;/code&gt; before interpolation, in both branches of &lt;code&gt;oauth_db_update()&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2026-06-06 — Reported to Zabbix with proof of concept&lt;/li&gt;
&lt;li&gt;2026-06-08 — Zabbix responds: not a security vulnerability&lt;/li&gt;
&lt;li&gt;2026-06-09 — Public disclosure&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="sqli"/><category term="oauth"/></entry><entry><title>SSH Connection Reuse Authentication-Context Bypass</title><link href="https://pop.argus-systems.ai/advisory/adv-021.html" rel="alternate"/><published>2026-06-08T00:00:00-07:00</published><updated>2026-06-08T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-08:/advisory/adv-021.html</id><summary type="html">&lt;p&gt;SSH connection reuse matching in libcurl does not verify SSH authentication context.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;SSH connection reuse matching in libcurl does not verify SSH authentication context (selected private/public key files). A request can reuse an existing authenticated SSH channel established with different SSH key settings, causing operations to execute under an unintended SSH identity.&lt;/p&gt;
&lt;h2&gt;Affected Versions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;libcurl with SSH/SFTP support (libssh2 and libssh backends)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Details&lt;/h2&gt;
&lt;p&gt;The reuse flow (&lt;code&gt;Curl_connect&lt;/code&gt; -&amp;gt; &lt;code&gt;url_find_or_create_conn&lt;/code&gt; -&amp;gt; &lt;code&gt;url_attach_existing&lt;/code&gt; -&amp;gt; &lt;code&gt;Curl_cpool_find&lt;/code&gt; -&amp;gt; &lt;code&gt;url_match_conn&lt;/code&gt;) calls &lt;code&gt;url_match_proto_config&lt;/code&gt; at &lt;code&gt;lib/url.c:918&lt;/code&gt;, which only checks HTTP/FTP-specific protocol config and has no SSH-equivalence checks.&lt;/p&gt;
&lt;p&gt;SSH key identity is loaded later from per-request options in &lt;code&gt;lib/vssh/libssh2.c&lt;/code&gt; (&lt;code&gt;ssh_state_pkey_init&lt;/code&gt;) and &lt;code&gt;lib/vssh/libssh.c&lt;/code&gt; (&lt;code&gt;myssh_in_AUTH_PKEY_INIT&lt;/code&gt;). Reused connections skip protocol connect/auth in &lt;code&gt;lib/multi.c:2523-2529&lt;/code&gt;, so authentication is never re-evaluated for the new request context.&lt;/p&gt;
&lt;p&gt;An application performing back-to-back SSH/SFTP requests with different &lt;code&gt;CURLOPT_SSH_PRIVATE_KEYFILE&lt;/code&gt; / &lt;code&gt;CURLOPT_SSH_PUBLIC_KEYFILE&lt;/code&gt; settings to the same destination will have the second request silently reuse the first connection's SSH identity.&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;Cross-request authentication-context confusion. Operations can execute under a prior SSH identity rather than the intended one, potentially granting unauthorized access to resources.&lt;/p&gt;
&lt;h2&gt;Remediation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fix PR: &lt;a href="https://github.com/curl/curl/pull/21899"&gt;curl/curl#21899 — Revert "url: remove ssh_config_matches"&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="auth"/><category term="ssh"/><category term="sftp"/><category term="connection-reuse"/></entry><entry><title>MFA Bypass via Federated Login Paths</title><link href="https://pop.argus-systems.ai/advisory/adv-033.html" rel="alternate"/><published>2026-06-08T00:00:00-07:00</published><updated>2026-06-08T00:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-08:/advisory/adv-033.html</id><summary type="html">&lt;p&gt;Zabbix MFA enforcement is bypassed when logging in via HTTP Basic Auth or SAML SSO paths, which create fully active sessions without triggering the MFA challenge.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Zabbix's MFA enforcement is configured per user group, not per authentication method. The HTTP auth (&lt;code&gt;index_http.php&lt;/code&gt;) and SAML SSO (&lt;code&gt;index_sso.php&lt;/code&gt;) login paths call &lt;code&gt;CUser::loginByUsername()&lt;/code&gt; which hardcodes &lt;code&gt;ZBX_SESSION_ACTIVE&lt;/code&gt;, ignoring the user's &lt;code&gt;mfaid&lt;/code&gt; entirely. This grants a fully active session with no MFA challenge using the same user account and password.&lt;/p&gt;
&lt;h2&gt;Affected Versions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Zabbix (all versions with MFA support)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Details&lt;/h2&gt;
&lt;p&gt;Both &lt;code&gt;CUser::login()&lt;/code&gt; and &lt;code&gt;CUser::loginByUsername()&lt;/code&gt; compute &lt;code&gt;mfaid&lt;/code&gt; from the same user group membership via &lt;code&gt;addUserGroupFields()&lt;/code&gt;. However, &lt;code&gt;loginByUsername()&lt;/code&gt; unconditionally passes &lt;code&gt;ZBX_SESSION_ACTIVE&lt;/code&gt; to &lt;code&gt;createSession()&lt;/code&gt;, discarding the MFA requirement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;login()           → mfaid respected → createSession(CONFIRMATION_REQUIRED) ✓
loginByUsername() → mfaid ignored   → createSession(ACTIVE)              ✗
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The root cause is in &lt;code&gt;CUser.php:2416&lt;/code&gt;. The HTTP auth and SAML SSO entry points contain no references to &lt;code&gt;mfaid&lt;/code&gt; or &lt;code&gt;index_mfa.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Preconditions:
- HTTP auth or SAML SSO enabled alongside internal auth
- Victim user is in a group with MFA required
- Global MFA enabled&lt;/p&gt;
&lt;h2&gt;Impact&lt;/h2&gt;
&lt;p&gt;Complete MFA bypass, provided HTTP auth or SAML is configured.&lt;/p&gt;
&lt;h2&gt;Remediation&lt;/h2&gt;
&lt;p&gt;No fix — Zabbix considers this not a security vulnerability.&lt;/p&gt;
&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2026-06-06 — Disclosed to Zabbix&lt;/li&gt;
&lt;li&gt;2026-06-08 — Zabbix responds: not a security vulnerability&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="auth_bypass"/><category term="web"/></entry><entry><title>Stack Buffer Overflow in ASP Handler</title><link href="https://pop.argus-systems.ai/advisory/adv-032.html" rel="alternate"/><published>2026-06-05T18:00:00-07:00</published><updated>2026-06-05T18:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-032.html</id><summary type="html">&lt;p&gt;An unchecked copy length derived from parsed network input causes a stack out-of-bounds write in the wlscan ASP handler.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;A binary analysis of the web CGI/ASP handling paths identified &lt;strong&gt;1 confirmed vulnerability&lt;/strong&gt;  The issue is a &lt;strong&gt;critical stack out-of-bounds write&lt;/strong&gt; in the &lt;code&gt;wlscan&lt;/code&gt; ASP handler, caused by an unchecked copy length derived from parsed input. The path is marked &lt;strong&gt;reachable from network&lt;/strong&gt;, so remote exploitation is feasible.&lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: PIE absent, NX absent, stack_canary absent, RELRO absent&lt;/li&gt;
&lt;li&gt;Risk Level: Critical&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. Stack OOB Write in wlscan ASP Handler — Critical&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: sub_415370 (wlscan ASP handler entry) @ 0x415370&lt;/li&gt;
&lt;li&gt;CWE: CWE-787 — Out-of-bounds Write (also CWE-121 — Stack-based Buffer Overflow)&lt;/li&gt;
&lt;li&gt;Category: memory_corruption&lt;/li&gt;
&lt;li&gt;Reachability: reachable_from_network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The handler performs &lt;code&gt;strncpy(&amp;amp;str_1, &amp;amp;var_744, len)&lt;/code&gt; at &lt;code&gt;0x415730&lt;/code&gt;, where &lt;code&gt;str_1&lt;/code&gt; is only &lt;code&gt;0x80&lt;/code&gt; bytes. The copy length is computed from pointer arithmetic (&lt;code&gt;$s2_1 - &amp;amp;var_744&lt;/code&gt;) at &lt;code&gt;0x415734&lt;/code&gt;, based on parsed data from an input line buffer, with no upper-bound check against the destination size. If &lt;code&gt;len&lt;/code&gt; exceeds &lt;code&gt;0x80&lt;/code&gt;, adjacent stack data can be overwritten. This creates a controllable memory-corruption primitive in a network-reachable code path.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fgets&lt;/code&gt; @ &lt;code&gt;0x4156a0&lt;/code&gt; (up to &lt;code&gt;0x200&lt;/code&gt; bytes into &lt;code&gt;&amp;amp;var_748&lt;/code&gt;)&lt;br&gt;
→ &lt;code&gt;strrchr(&amp;amp;var_748, ':')&lt;/code&gt; @ &lt;code&gt;0x415710&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;$s2_1 = strrchr_result - 0xe&lt;/code&gt; @ &lt;code&gt;0x415718&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;len = $s2_1 - &amp;amp;var_744&lt;/code&gt; @ &lt;code&gt;0x415734&lt;/code&gt; (no &lt;code&gt;len &amp;lt;= 0x80&lt;/code&gt; guard)&lt;br&gt;
→ &lt;code&gt;strncpy(&amp;amp;str_1, &amp;amp;var_744, len)&lt;/code&gt; @ &lt;code&gt;0x415730&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: bounds_check, stack_canary, NX, PIE, RELRO&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="binary"/></entry><entry><title>Race Condition in Temporary File Handling</title><link href="https://pop.argus-systems.ai/advisory/adv-031.html" rel="alternate"/><published>2026-06-05T17:00:00-07:00</published><updated>2026-06-05T17:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-031.html</id><summary type="html">&lt;p&gt;A non-atomic stat/unlink/fopen sequence on a fixed path in /var/tmp is exploitable via symlink substitution.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;A targeted review of five candidate functions identified &lt;strong&gt;1 confirmed vulnerability&lt;/strong&gt; in &lt;code&gt;open_ssl_error_file&lt;/code&gt;. The issue is a &lt;strong&gt;high-severity TOCTOU race condition&lt;/strong&gt; on a fixed path in &lt;code&gt;/var/tmp&lt;/code&gt;, enabling unsafe file writes via symlink substitution. While the vulnerable path is reachable from network-driven logic, practical exploitation requires a local race precondition (filesystem namespace control), so purely remote-only exploitation is not directly feasible.&lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: PIE (absent), NX (absent), stack_canary (absent), RELRO (absent)&lt;/li&gt;
&lt;li&gt;Risk Level: High&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. TOCTOU Race on Fixed &lt;code&gt;/var/tmp/https.error&lt;/code&gt; Path — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;open_ssl_error_file&lt;/code&gt; @ &lt;code&gt;0x41bb58&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: CWE-367 — Time-of-check Time-of-use (TOCTOU) Race Condition&lt;/li&gt;
&lt;li&gt;Category: other&lt;/li&gt;
&lt;li&gt;Reachability: reachable_from_network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The function performs a non-atomic check-then-use sequence on the same pathname: &lt;code&gt;stat("/var/tmp/https.error")&lt;/code&gt;, conditional &lt;code&gt;unlink("/var/tmp/https.error")&lt;/code&gt;, then &lt;code&gt;fopen("/var/tmp/https.error", "a+")&lt;/code&gt;. Because &lt;code&gt;/var/tmp&lt;/code&gt; is attacker-writable, an attacker can swap the path to a symlink between these operations. This race can redirect file writes to an attacker-chosen target file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;filesystem namespace control in /var/tmp before stat @ 0x41bb80&lt;/code&gt; -&amp;gt; &lt;code&gt;size check on stat result (var_74) @ 0x41bb90/0x41bb94&lt;/code&gt; -&amp;gt; &lt;code&gt;conditional unlink on same path @ 0x41bbcc&lt;/code&gt; -&amp;gt; &lt;code&gt;fopen("/var/tmp/https.error", "a+") @ 0x41bba8&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: O_NOFOLLOW, fd_post_open_fstat_validation, PIE, NX, stack_canary, RELRO&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="binary"/></entry><entry><title>Signedness Error in Network Read Path</title><link href="https://pop.argus-systems.ai/advisory/adv-030.html" rel="alternate"/><published>2026-06-05T16:00:00-07:00</published><updated>2026-06-05T16:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-030.html</id><summary type="html">&lt;p&gt;Error sentinel values from web_read are propagated as unsigned size arguments to f_write, enabling oversized memory operations.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;The analyzed binary’s Explorer-flagged read/write paths were reviewed for, and 2 high-severity findings were confirmed. Both issues are signedness flaws where an error sentinel (&lt;code&gt;0xffffffff&lt;/code&gt;) from &lt;code&gt;web_read&lt;/code&gt; is propagated into an unsigned size parameter for &lt;code&gt;f_write&lt;/code&gt;, creating oversized memory operations. Overall risk is &lt;strong&gt;High&lt;/strong&gt;; exploitation appears remotely reachable via network input, but requires the read-error precondition to trigger the sentinel path.&lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: &lt;strong&gt;PIE: absent, NX: absent, stack_canary: absent, RELRO: absent&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Risk Level: &lt;strong&gt;High&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. Signed Error Sentinel Used as &lt;code&gt;f_write&lt;/code&gt; Length in &lt;code&gt;sub_41a6ac&lt;/code&gt; — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;sub_41a6ac&lt;/code&gt; @ &lt;code&gt;0x41a6ac&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: &lt;code&gt;CWE-195 — Signed to Unsigned Conversion Error&lt;/code&gt;; &lt;code&gt;CWE-196 — Unsigned to Signed Conversion Error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Category: &lt;code&gt;memory_corruption&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reachability: &lt;code&gt;reachable_from_network&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sub_41a6ac&lt;/code&gt; allocates a bounded heap buffer and then uses the return value of &lt;code&gt;web_read&lt;/code&gt; directly as the length argument to &lt;code&gt;f_write&lt;/code&gt;. In &lt;code&gt;web_read&lt;/code&gt;, the error path returns &lt;code&gt;0xffffffff&lt;/code&gt; (&lt;code&gt;0x4196b4&lt;/code&gt;). Without a positivity/error check before the sink, this sentinel is interpreted as a very large unsigned size, causing oversized read behavior from the heap buffer with crash or potential information disclosure impact.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;web_read/fread&lt;/code&gt; error sentinel &lt;code&gt;0xffffffff&lt;/code&gt; @ &lt;code&gt;0x4196b4&lt;/code&gt; →&lt;br&gt;
&lt;code&gt;$v0_4#4 = web_read(...)&lt;/code&gt; @ &lt;code&gt;0x41a798&lt;/code&gt; → &lt;code&gt;$s0_1#3 = $v0_4#4&lt;/code&gt; @ &lt;code&gt;0x41a7a8&lt;/code&gt; → &lt;code&gt;$a2_1#1 = $s0_1#3&lt;/code&gt; @ &lt;code&gt;0x41a818&lt;/code&gt; →&lt;br&gt;
&lt;code&gt;f_write(..., $a2_1#1, ...)&lt;/code&gt; @ &lt;code&gt;0x41a814&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: &lt;code&gt;bounds_check&lt;/code&gt;, &lt;code&gt;stack_canary&lt;/code&gt;, &lt;code&gt;PIE&lt;/code&gt;, &lt;code&gt;NX&lt;/code&gt;, &lt;code&gt;RELRO&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Repeated Signedness Length Propagation in &lt;code&gt;sub_41ab84&lt;/code&gt; — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;sub_41ab84&lt;/code&gt; @ &lt;code&gt;0x41ab84&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: &lt;code&gt;CWE-195 — Signed to Unsigned Conversion Error&lt;/code&gt;; &lt;code&gt;CWE-196 — Unsigned to Signed Conversion Error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Category: &lt;code&gt;memory_corruption&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reachability: &lt;code&gt;reachable_from_network&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sub_41ab84&lt;/code&gt; repeats the same pattern: it stores &lt;code&gt;web_read&lt;/code&gt;’s return value and forwards it directly to &lt;code&gt;f_write&lt;/code&gt; as size. If &lt;code&gt;web_read&lt;/code&gt; returns &lt;code&gt;0xffffffff&lt;/code&gt; on read failure, the sink consumes it as a huge unsigned length. This enables an oversized operation against the allocated input buffer and can lead to memory safety failures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;web_read/fread&lt;/code&gt; error sentinel &lt;code&gt;0xffffffff&lt;/code&gt; @ &lt;code&gt;0x4196b4&lt;/code&gt; →&lt;br&gt;
&lt;code&gt;$v0_5#5 = web_read(...)&lt;/code&gt; @ &lt;code&gt;0x41ac68&lt;/code&gt; → &lt;code&gt;$s0_1#3 = $v0_5#5&lt;/code&gt; @ &lt;code&gt;0x41ac78&lt;/code&gt; → &lt;code&gt;$a2_1#1 = $s0_1#3&lt;/code&gt; @ &lt;code&gt;0x41acbc&lt;/code&gt; →&lt;br&gt;
&lt;code&gt;f_write(..., $a2_1#1, ...)&lt;/code&gt; @ &lt;code&gt;0x41acb8&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: &lt;code&gt;bounds_check&lt;/code&gt;, &lt;code&gt;stack_canary&lt;/code&gt;, &lt;code&gt;PIE&lt;/code&gt;, &lt;code&gt;NX&lt;/code&gt;, &lt;code&gt;RELRO&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At the call site in &lt;code&gt;sub_41ab84&lt;/code&gt;, gate &lt;code&gt;f_write&lt;/code&gt; on successful, non-negative read lengths and clamp to the buffer’s allocated size before passing &lt;code&gt;a2&lt;/code&gt; at &lt;code&gt;0x41acb8&lt;/code&gt;. Centralize this check in a shared helper to prevent recurrence across similar read/write paths.&lt;/p&gt;</content><category term="advisories"/><category term="binary"/></entry><entry><title>Path Traversal in File Handler</title><link href="https://pop.argus-systems.ai/advisory/adv-029.html" rel="alternate"/><published>2026-06-05T15:00:00-07:00</published><updated>2026-06-05T15:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-029.html</id><summary type="html">&lt;p&gt;Attacker-controlled filename input reaches fopen and unlink calls without canonicalization or directory confinement.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;One high-severity vulnerability was confirmed in the analyzed binary  The issue is a CWE-22 path traversal in &lt;code&gt;sub_40fa90&lt;/code&gt;, where attacker-controlled input reaches filesystem APIs without normalization or confinement checks. Exploitation is remotely reachable via network input.&lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: PIE: absent, NX: absent, stack_canary: absent, RELRO: absent&lt;/li&gt;
&lt;li&gt;Risk Level: High&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. Unsanitized User Path Reaching File APIs (Path Traversal) — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;sub_40fa90&lt;/code&gt; @ &lt;code&gt;0x40fa90&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: CWE-22 — Path Traversal&lt;/li&gt;
&lt;li&gt;Category: other&lt;/li&gt;
&lt;li&gt;Reachability: reachable_from_network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The handler reads attacker-controlled &lt;code&gt;filename&lt;/code&gt; from &lt;code&gt;webcgi_get("filename")&lt;/code&gt; and uses it directly in file-operation sinks. The value flows into &lt;code&gt;fopen&lt;/code&gt; and multiple &lt;code&gt;unlink&lt;/code&gt; calls without &lt;code&gt;realpath&lt;/code&gt;-style canonicalization or root-directory confinement checks. This allows traversal inputs (for example &lt;code&gt;../../...&lt;/code&gt;) or absolute paths to access or delete unintended files. Because the input is network-reachable, this creates a high-risk arbitrary file access/deletion condition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;webcgi_get("filename") @ 0x40faec&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;filename#2&lt;/code&gt; assigned from web input&lt;br&gt;
→ &lt;code&gt;$s1_1&lt;/code&gt; propagated into branch-specific sink arguments&lt;br&gt;
→ &lt;code&gt;fopen @ 0x410068&lt;/code&gt; (also &lt;code&gt;0x410380&lt;/code&gt;) and &lt;code&gt;unlink @ 0x40fe88&lt;/code&gt; (also &lt;code&gt;0x40fe4c/0x40fd98/0x410278/0x4104d4&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: stack_canary, PIE, NX, RELRO, path_canonicalization, path_confinement_check&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="binary"/></entry><entry><title>OS Command Injection via Web Interface</title><link href="https://pop.argus-systems.ai/advisory/adv-027.html" rel="alternate"/><published>2026-06-05T12:00:00-07:00</published><updated>2026-06-05T12:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-027.html</id><summary type="html">&lt;p&gt;User-controlled CGI parameters and request-derived buffers are embedded into shell command strings and executed without sanitization.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;A firmware binary was analyzed for command-execution weaknesses  The analysis confirmed &lt;strong&gt;2 high-severity findings&lt;/strong&gt;, both involving user-influenced network input embedded into shell command strings and executed via &lt;code&gt;system&lt;/code&gt;/&lt;code&gt;popen&lt;/code&gt;. Overall risk is &lt;strong&gt;High&lt;/strong&gt;; remote exploitation is feasible from network-reachable paths.&lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: PIE (absent), NX (absent), stack_canary (absent), RELRO (absent)&lt;/li&gt;
&lt;li&gt;Risk Level: High&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. CGI &lt;code&gt;user&lt;/code&gt; Parameter Reaches &lt;code&gt;system&lt;/code&gt; Command — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;sub_407bcc&lt;/code&gt; @ &lt;code&gt;0x407bcc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: CWE-78 — OS Command Injection&lt;/li&gt;
&lt;li&gt;Category: command_injection&lt;/li&gt;
&lt;li&gt;Reachability: reachable_from_network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The function reads CGI parameter &lt;code&gt;user&lt;/code&gt; using &lt;code&gt;webcgi_get("user")&lt;/code&gt; and formats it into &lt;code&gt;pam_tally2 -u %s -r&lt;/code&gt; with &lt;code&gt;snprintf&lt;/code&gt;. The resulting string is executed with &lt;code&gt;system&lt;/code&gt;, creating a direct shell injection surface. No strict allowlist validation of the substituted &lt;code&gt;user&lt;/code&gt; value is performed in this function, so shell metacharacters can alter command behavior.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;webcgi_get("user") @ 0x407c10&lt;/code&gt; -&amp;gt; &lt;code&gt;$s1 &amp;lt;- result @ 0x407c20&lt;/code&gt; -&amp;gt; &lt;code&gt;snprintf(&amp;amp;var_110, 0x100, 0x4206e4, $s1) @ 0x407c68&lt;/code&gt; -&amp;gt; &lt;code&gt;system(&amp;amp;var_110) @ 0x407c78&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: PIE, NX, stack_canary, RELRO, strict_input_allowlist&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Captive Portal Request Slice Injected into &lt;code&gt;system&lt;/code&gt;/&lt;code&gt;popen&lt;/code&gt; — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;get_captive_portal_auth&lt;/code&gt; @ &lt;code&gt;0x41b6c0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: CWE-78 — OS Command Injection&lt;/li&gt;
&lt;li&gt;Category: command_injection&lt;/li&gt;
&lt;li&gt;Reachability: reachable_from_network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A request-derived buffer (&lt;code&gt;arg1&lt;/code&gt;) is offset (&lt;code&gt;arg1 + 4&lt;/code&gt;) and inserted as &lt;code&gt;%s&lt;/code&gt; into shell templates &lt;code&gt;chilli_query list |grep %s&lt;/code&gt; and &lt;code&gt;chilli_query authorize ip %s&lt;/code&gt;. These commands are executed by &lt;code&gt;popen&lt;/code&gt; and &lt;code&gt;system&lt;/code&gt;, respectively. Although credential checks exist (&lt;code&gt;portal_lo_un&lt;/code&gt;/&lt;code&gt;portal_lo_pw&lt;/code&gt;), the shell-substituted argument itself is not strictly validated, enabling command injection via crafted input.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;request-derived arg1 buffer ($s0 &amp;lt;- arg1 @ 0x41b6fc)&lt;/code&gt; -&amp;gt; &lt;code&gt;$s2_1 &amp;lt;- $s0 + 4 @ 0x41b8f8 / 0x41b844&lt;/code&gt; -&amp;gt; &lt;code&gt;snprintf(..., 0x4252d4, $s2_1) @ 0x41b90c&lt;/code&gt; and &lt;code&gt;snprintf(..., 0x425340, $s2_1) @ 0x41b860&lt;/code&gt; -&amp;gt; &lt;code&gt;system(command) @ 0x41b8c8&lt;/code&gt; and &lt;code&gt;popen(command) @ 0x41b924&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: PIE, NX, stack_canary, RELRO, command_argument_validation&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="binary"/></entry><entry><title>Hardcoded Default Credentials</title><link href="https://pop.argus-systems.ai/advisory/adv-026.html" rel="alternate"/><published>2026-06-05T11:00:00-07:00</published><updated>2026-06-05T11:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-026.html</id><summary type="html">&lt;p&gt;A hardcoded default admin password literal is embedded in the binary and used in authentication comparisons.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;A binary analysis of authentication-related code paths identified &lt;strong&gt;1 security finding&lt;/strong&gt;: a &lt;strong&gt;high-severity CWE-798 hardcoded/default credential pattern&lt;/strong&gt;. The issue is located in &lt;code&gt;sub_4072ec&lt;/code&gt;, where an embedded password literal (&lt;code&gt;"123456"&lt;/code&gt;) is used in an admin-password comparison flow. &lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: PIE (absent), NX (absent), stack_canary (absent), RELRO (absent)&lt;/li&gt;
&lt;li&gt;Risk Level: High&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. Hardcoded Default Admin Password Literal — High&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;sub_4072ec (passwd_risk handler)&lt;/code&gt; @ &lt;code&gt;0x4072ec&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: CWE-798 — Use of Hard-coded Credentials&lt;/li&gt;
&lt;li&gt;Category: info_leak&lt;/li&gt;
&lt;li&gt;Reachability: unknown&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The binary embeds a fixed admin password literal &lt;code&gt;"123456"&lt;/code&gt; at &lt;code&gt;0x42046c&lt;/code&gt; and uses it in &lt;code&gt;nvram_default_match("adm_passwd", "123456", 0)&lt;/code&gt; at &lt;code&gt;0x407318&lt;/code&gt;. This creates a hardcoded/default credential condition that can be recovered through static binary analysis. If deployed devices retain default credentials, an attacker can attempt authentication using this known value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;embedded credential literal "123456" @ 0x42046c&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;"adm_passwd" key literal @ 0x420460&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;comparison result branches to passwd_risk=1/0 output @ 0x420474 / 0x420484&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;nvram_default_match @ 0x407318&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: PIE, NX, stack_canary, RELRO&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="binary"/></entry><entry><title>Sensitive Data Exposure in Logs</title><link href="https://pop.argus-systems.ai/advisory/adv-025.html" rel="alternate"/><published>2026-06-05T10:00:00-07:00</published><updated>2026-06-05T10:00:00-07:00</updated><author><name>Argus</name></author><id>tag:pop.argus-systems.ai,2026-06-05:/advisory/adv-025.html</id><summary type="html">&lt;p&gt;Captive portal credentials are written to syslog in plaintext on authentication failure.&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Executive Summary&lt;/h2&gt;
&lt;p&gt;An authentication-related binary path was analyzed (including &lt;code&gt;get_captive_portal_auth&lt;/code&gt;), and 1 vulnerability was confirmed. The issue is a &lt;strong&gt;medium-severity CWE-532&lt;/strong&gt; information leak where configured portal credentials are written to syslog in plaintext on auth failure.&lt;/p&gt;
&lt;h2&gt;Binary Profile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security Flags: PIE absent / NX absent / stack_canary absent / RELRO absent&lt;/li&gt;
&lt;li&gt;Risk Level: Medium&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Findings&lt;/h2&gt;
&lt;h3&gt;1. Sensitive Portal Credentials Logged on Authentication Failure — Medium&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Function: &lt;code&gt;get_captive_portal_auth&lt;/code&gt; @ &lt;code&gt;0x41b6c0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CWE: CWE-532 — Insertion of Sensitive Information into Log File&lt;/li&gt;
&lt;li&gt;Category: info_leak&lt;/li&gt;
&lt;li&gt;Reachability: reachable_from_network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At &lt;code&gt;0x41b998&lt;/code&gt;, the function calls &lt;code&gt;syslog&lt;/code&gt; with format string &lt;code&gt;"portal auth failed [%s] [%s]"&lt;/code&gt; and includes values derived from authentication fields and stored portal credentials. SSA evidence shows values from &lt;code&gt;nvram_safe_get("portal_lo_un")&lt;/code&gt; and &lt;code&gt;nvram_safe_get("portal_lo_pw")&lt;/code&gt; flow into syslog arguments without redaction. This can expose plaintext configured username/password values in logs when authentication fails. Because the code path is network-reachable, remote requests can trigger repeated sensitive log entries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taint Chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nvram_safe_get("portal_lo_pw") @ 0x41b7d8&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;str2#6 = phi(str2_1,str2_2) @ 0x41b990&lt;/code&gt;&lt;br&gt;
→ &lt;code&gt;$a3_3#7 = str2#6 @ 0x41b994&lt;/code&gt;&lt;br&gt;
(+ parallel input &lt;code&gt;str1#7&lt;/code&gt; from &lt;code&gt;arg1&lt;/code&gt; offsets &lt;code&gt;+0x14/+0x94&lt;/code&gt; via phi @ &lt;code&gt;0x41b990&lt;/code&gt;)&lt;br&gt;
→ &lt;code&gt;syslog(6, "portal auth failed [%s] [%s]", ...) @ 0x41b998&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Present: none&lt;/li&gt;
&lt;li&gt;Absent: credential_redaction, stack_canary, PIE, NX, RELRO&lt;/li&gt;
&lt;/ul&gt;</content><category term="advisories"/><category term="binary"/></entry></feed>