<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.oxide.computer/bulletins/undefined</id>
    <title>Oxide Advisories Security Bulletins</title>
    <updated>2026-04-03T23:10:23.206Z</updated>
    <generator>Remix using Feed for Node.js</generator>
    <author>
        <name>Oxide Computer Company</name>
        <email>info@oxide.computer</email>
        <uri>https://docs.oxide.computer</uri>
    </author>
    <link rel="alternate" href="https://docs.oxide.computer/bulletins/undefined"/>
    <link rel="self" href="https://docs.oxide.computer/security/undefined/feed"/>
    <subtitle>Security bulletins feed for Advisories</subtitle>
    <logo>https://docs.oxide.computer/favicon.png</logo>
    <icon>https://docs.oxide.computer/favicon.png</icon>
    <rights>Copyright © 2026 Oxide Computer Company</rights>
    <entry>
        <title type="html"><![CDATA[Oxide Security Advisory 20251117-1: CVE-2025-66432 API tokens can be renewed past their expiration date]]></title>
        <id>https://docs.oxide.computer/security/advisories/20251117-1</id>
        <link href="https://docs.oxide.computer/security/advisories/20251117-1"/>
        <updated>2025-11-17T12:00:00.000Z</updated>
        <content type="html"><![CDATA[<div id="content" class="asciidoc-body release-note-doc w-full"><div id="preamble"><div class="sectionbody"><div class="paragraph"><p>Oxide introduced the ability to set an expiration for API tokens starting in
release <a href="/release-notes/system/15">15</a>. Additionally, silo administrators can
set the maximum expiration of every access token, with the goal that renewing
tokens past their expiration would require re-authenticating with the identity
provider to generate new tokens.</p></div><div class="paragraph"><p>We have recently discovered that an API token can be used to generate
new tokens that expire past the expiration of the original token used to
create them:</p></div><div class="ulist"><ul class=""><li><p>An attacker who already compromised a token through other means can
extend their access to the Oxide API past the token expiration, using
new tokens generated by that original token.</p></li><li><p>An authorized user can bypass a silo’s maximum token expiration time,
potentially unknowingly.</p></li></ul></div><div class="paragraph"><p>This is fixed in release <a href="/release-notes/system/17#_patches">17.1</a>, which
will limit the maximum expiration of an API token to the expiration of the token
that created it. Tokens created or approved using a browser console session are
not affected by this.</p></div><div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"><caption class="title"><a class="anchor" id="revision_history"></a><a href="#revision_history"><div class="title">Revision History</div></a></caption><colgroup><col style="width:33.3333%"/><col style="width:33.3333%"/><col style="width:33.3334%"/></colgroup><thead><tr><th class="tableblock halign-left valign-top">Revision</th><th class="tableblock halign-left valign-top">Date (YYYYMMDD)</th><th class="tableblock halign-left valign-top">Changes
! 1.2</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">20251202</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Add CVE identifier</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">1.1</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">20251118</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Update docs site links</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td></tr></tbody></table></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impacted_products" aria-hidden="true"></span><a class="link group" href="#_impacted_products">Impacted Products<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Oxide software releases <a href="/release-notes/system/15">15</a>,
<a href="/release-notes/system/16">16</a>, and <a href="/release-notes/system/17">17</a>.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impact" aria-hidden="true"></span><a class="link group" href="#_impact">Impact<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>This vulnerability can be exploited by an attacker who has already
obtained a valid Oxide API token (and thus already has access to the
Oxide API) to extend their window of access past that token’s
expiration, potentially indefinitely. It does not allow an attacker to
gain more privileges than they already have.</p></div><div class="paragraph"><p>This vulnerability could also allow silo users to extend their
legitimate API tokens past the maximum expiration date configured by
silo administrators, potentially unknowingly.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_action_required" aria-hidden="true"></span><a class="link group" href="#_action_required">Action Required<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Update the Oxide software to version 17.1 (must be scheduled with Oxide
Support).</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_mitigations" aria-hidden="true"></span><a class="link group" href="#_mitigations">Mitigations<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>There is no current mitigation for the affected releases.</p></div><div class="paragraph"><p>While audit logs were introduced in release 16, they do not currently
contain the ID of the API token used to send the request. Audit logs
only record all token creation requests by filtering for the
device_auth_confirm operation ID. We are planning to add token IDs to
audit logs in release 18 (see
<a href="https://github.com/oxidecomputer/omicron/pull/8813">omicron#8813</a>).</p></div><div class="paragraph"><p>After upgrading to release 17.1, we recommend silo admins review all
existing tokens, using the Oxide API
(<a href="/api/user_token_list"><code>/v1/users/{user_id}/access-tokens</code></a>).</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_technical_background" aria-hidden="true"></span><a class="link group" href="#_technical_background">Technical Background<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>The Oxide rack uses the OAuth device flow to issue device tokens
(commonly referred as API tokens). As of today, it is the only way to
get a token for the Oxide API. With the device flow, the user approves
the issuance of the token using an existing authenticated session. Once
the issuance is approved, the client can request the new token from the
Oxide API.</p></div><div class="paragraph"><p>When using the Oxide console to approve the issuance (as it’s done in
most cases, including with the Oxide CLI), this presents no security
concerns: console sessions are short-lived, they require at least daily
re-authentication with the identity provider, and it’s expected that
authenticating with the console allows generating tokens expiring beyond
the console session.</p></div><div class="paragraph"><p>Issuance can also be approved with existing API tokens, which can be
(for example) useful to create short-lived Oxide API tokens from a
longer-lived token. In this case, generating tokens expiring beyond the
originating token subverts that expiration. In other words, any existing
token could create a new version of itself.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_additional_information" aria-hidden="true"></span><a class="link group" href="#_additional_information">Additional Information<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>N/A</p></div></div></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oxide Security Advisory 20240118-1: CVE-2024-55582 Unencrypted Control Plane datastores in Oxide software]]></title>
        <id>https://docs.oxide.computer/security/advisories/20240118-1</id>
        <link href="https://docs.oxide.computer/security/advisories/20240118-1"/>
        <updated>2024-01-18T12:00:00.000Z</updated>
        <content type="html"><![CDATA[<div id="content" class="asciidoc-body release-note-doc w-full"><div id="preamble"><div class="sectionbody"><div class="paragraph"><p>The ZFS datasets which contain the Oxide Control Plane datastores, including CockroachDB,  ClickHouse timeseries database and Crucible file systems, did not have the encryption setting correctly configured prior to version 6 of the Oxide software.</p></div><div class="paragraph"><p>The issue allows attackers who have physical access to the Oxide Rack to remove physical disks and potentially obtain the Control Plane data by examining the content of unencrypted datasets in the disks, locating one of the CockroachDB datasets, and reading the database tables with software capable of parsing the raw data. The information may in turn be used for further exploits such as:</p></div><div class="ulist"><ul class=""><li><p>Stealing another user’s device token and impersonating the user to access their VM instances</p></li><li><p>Using the crucible volume encryption keys to decrypt the virtual disk data</p></li></ul></div><div class="paragraph"><p>This issue is fixed in version 6 of the Oxide software; we recommend customers upgrade as soon as possible.</p></div><div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"><caption class="title"><a class="anchor" id="revision_history"></a><a href="#revision_history"><div class="title">Revision History</div></a></caption><colgroup><col style="width:33.3333%"/><col style="width:33.3333%"/><col style="width:33.3334%"/></colgroup><thead><tr><th class="tableblock halign-left valign-top">Revision</th><th class="tableblock halign-left valign-top">Date (YYYYMMDD)</th><th class="tableblock halign-left valign-top">Changes</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">1.2</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">20241212</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Add CVE identifier and CVSS vector</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">1.1</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">20240409</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Indicate affected versions and fix availability in summary</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">20240325</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Add &quot;Technical Background&quot; section</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">0.1</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">20240118</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Initial Release</p></td></tr></tbody></table></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impacted_products" aria-hidden="true"></span><a class="link group" href="#_impacted_products">Impacted Products<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Oxide software releases version 5 and earlier.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impact" aria-hidden="true"></span><a class="link group" href="#_impact">Impact<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>An attacker who has physical access to the Oxide Rack and the knowledge about the Control Plane databases may be able to access the data on the physical storage devices. They may be able to view and modify system data such as user device tokens, rack configurations, VM instance and disk metadata. They may also be able to examine the disk data by decrypting it with the application-level encryption keys stored in the CockroachDB. The issue can manifest as unauthorized use of VM instances and sensitive data stored in the disks.</p></div><div class="paragraph"><p>Oxide calculates a CVSS v3.1 base score of 5.7 (Medium). Vector: <a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:P/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N&amp;version=3.1">CVSS:3.1/AV:P/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N</a></p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_action_required" aria-hidden="true"></span><a class="link group" href="#_action_required">Action Required<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Update the Oxide software to version 6.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_mitigations" aria-hidden="true"></span><a class="link group" href="#_mitigations">Mitigations<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>There are no mitigations available besides enforcing controls against unauthorized rack physical access.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_technical_background" aria-hidden="true"></span><a class="link group" href="#_technical_background">Technical Background<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Oxide provides encryption at rest for both customer data, and Oxide control plane data. The goal of such encryption is to prevent offline attacks, such that a casual attacker with physical access to the rack cannot steal a subset of disks or sleds and recover sensitive information off of them. Unique encryption keys per U.2 drive are derived from a shared rack secret which is computed at each sled via an implementation of Shamir secret sharing. In order to reconstruct the rack secret and derive encryption keys, at least a threshold, <code>t</code>, of sleds must participate in an online distributed algorithm. During installation, <code>t = N/2 + 1</code>, where <code>N</code> is the number of sleds in a rack. Concretely, for a 16 sled rack, <code>t=9</code>, where for a 32 sled rack, <code>t = 17</code>. If fewer than <code>t</code> sleds can participate, then no data can be learned about the rack secret and no encryption keys may be derived. The rack secret is split into distinct key shares which are stored on M.2 drives of each of the sleds, and are not immediately available to steal without taking a sled out of the rack. At least <code>t</code> M.2 drives would have to be stolen in order for an attacker to reconstruct the rack secret, derive encryption keys, and then access data on stolen U.2 drives. This provides sufficient mitigation against casual theft of few sleds or drives from being useful to an attacker.</p></div><div class="paragraph"><p>Inside an Oxide rack, customer and Oxide control plane data are stored inside <code>ZFS datasets</code>. Each ZFS dataset has a <code>path</code>, which dictates its location in a hierarchy, and this path corresponds to the fileysystem mount path, but is distinct from it. There are up to 10 U.2 disks on each sled in the rack, and each of these has an encrypted root dataset at path <code>oxp_&lt;UUID&gt;/crypt</code>, where <code>&lt;UUID&gt;</code> is distinct per U.2 disk. ZFS allows child datasets to inherit encryption, such that if the child dataset resides under the path of an encrypted filesystem, the child dataset is also encrypted using the same key. By default, encryption is inherited, and so a dataset such as <code>oxp_&lt;UUID&gt;/crypt/zone/cockroachdb</code> would be encrypted. However, since we only encrypt under our <code>crypt</code> root, a dataset not under that hierarchy, such as <code>oxp_&lt;UUID&gt;/cockroachdb</code>  will not be encrypted via ZFS dataset encryption. Keys used for ZFS encryption are derived from the Oxide rack secret as discussed above.</p></div><div class="paragraph"><p>We have two primary types of datasets, ephemeral "zone" datasets which act as the root filesystems of illumos zones and may be recreated across reboots, and persistent "data" datasets that store data associated with the zone, including database state. On launch of a zone, the "data" datasets get mounted into the zone and are used to store customer and Oxide control plane specific data. While the ephemeral zone datasets had paths under our <code>crypt</code> root (<code>oxp_&lt;UUID&gt;/crypt</code>) and therefore inherited the encryption property, our persistent zones were created outside of the <code>crypt</code> hierarchy, and therefore were not encrypted. Unfortunately, persistent datasets contain the most critical data
of the Oxide rack, such as <code>cockroachdb</code> data, debug data, <code>clickhouse</code>  data, and <code>dns</code> data. None of this data was actually encrypted because all of these datasets resided outside the <code>crypt</code> hierarchy. It should be noted that while crucible datasets live outside the <code>crypt</code> hierarchy, they are encrypted with a different application level mechanism and remained encrypted. Unfortunately the encryption keys were stored in <code>cockroachdb</code> datasets which were unencrypted.</p></div><div class="paragraph"><p>By upgrading to at least Oxide release version 6, existing deployments will have their unencrypted datasets migrated into encrypted datasets at boot time, before usage. New deployments will only create encrypted datasets. As an additional safety measure, any time a dataset is mounted into a zone, the zone will check to see if it is encrypted and error if it is not. This allows fail-fast identification of problems during both development and customer usage.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_additional_information" aria-hidden="true"></span><a class="link group" href="#_additional_information">Additional Information<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>There is no additional information at this time.</p></div></div></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oxide Security Advisory 20231215-1: CVE-2023-50913 SSRF in Oxide software]]></title>
        <id>https://docs.oxide.computer/security/advisories/20231215-1</id>
        <link href="https://docs.oxide.computer/security/advisories/20231215-1"/>
        <updated>2023-12-15T12:00:00.000Z</updated>
        <content type="html"><![CDATA[<div id="content" class="asciidoc-body release-note-doc w-full"><div id="preamble"><div class="sectionbody"><div class="paragraph"><p>A server-side request forgery (SSRF) issue exists in version 4 and
older of the Oxide software. This issue allows authenticated users
with the collaborator role on a project or silo to send HTTP HEAD and
GET requests to arbitrary URLs on the underlay network, the primary
physical rack-internal IPv6 network where services internal to the
system communicate.</p></div><div class="paragraph"><p>This issue allows such users to send arbitrary queries to the metrics
service if the internal underlay network address for the ClickHouse
service is known. The responses to those queries cannot be read, but
such users can still tamper with metrics data and prevent metrics APIs
from working.</p></div><div class="paragraph"><p>This issue also potentially allows users to read from a limited set
of debugging endpoints served by CockroachDB if the internal underlay
network address is known and the endpoint meets certain requirements.
The set of requirements necessary for information disclosure rules out
nearly all HTTP endpoints served by CockroachDB, but Oxide is unable to
rule out all endpoints at this time.</p></div><div class="paragraph"><p>This issue is fixed in version 5 of the Oxide software; we recommend
customers upgrade as soon as possible.</p></div><div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"><caption class="title"><a class="anchor" id="revision_history"></a><a href="#revision_history"><div class="title">Revision History</div></a></caption><colgroup><col style="width:33.3333%"/><col style="width:33.3333%"/><col style="width:33.3334%"/></colgroup><thead><tr><th class="tableblock halign-left valign-top">Revision</th><th class="tableblock halign-left valign-top">Date (YYYYMMDD)</th><th class="tableblock halign-left valign-top">Changes</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">20231215</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Initial Release</p></td></tr></tbody></table></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impacted_products" aria-hidden="true"></span><a class="link group" href="#_impacted_products">Impacted Products<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Oxide software releases version 4 and earlier.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impact" aria-hidden="true"></span><a class="link group" href="#_impact">Impact<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>An authenticated user with the collaborator role on a project or silo
can trigger HTTP HEAD and GET requests to arbitrary URLs on the underlay
network. This can manifest as a loss of integrity and availability of
metrics data, and can possibly manifest as an information disclosure of
debugging information for the primary database.</p></div><div class="paragraph"><p>Oxide calculates a CVSS v3.1 base score of 4.9 (Medium). Vector:
<a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:H/PR:L/UI:N/S:C/C:N/I:L/A:L&amp;version=3.1">CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:N/I:L/A:L</a></p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_action_required" aria-hidden="true"></span><a class="link group" href="#_action_required">Action Required<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Update the Oxide software to version 5.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_mitigations" aria-hidden="true"></span><a class="link group" href="#_mitigations">Mitigations<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>There are no mitigations available.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_technical_background" aria-hidden="true"></span><a class="link group" href="#_technical_background">Technical Background<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>In version 4 and older of the Oxide software, a user with the
collaborator role on a project or silo could create an image with the
<code>url</code> source via the <code>image_create</code> endpoint, or import blocks from
a URL into a disk via the <code>disk_import_blocks_from_url</code> endpoint.
These were used during development prior to the ability to create
an image from a snapshot and to bulk-write disk blocks via the
<code>disk_bulk_write_import</code> endpoint. Version 5 of the Oxide software
removes the <code>url</code> image source and the <code>disk_import_blocks_from_url</code>
endpoint.</p></div><div class="paragraph"><p>When a user creates an image with the <code>url</code> source, Nexus (the Oxide
API server) makes an HTTP HEAD request to the user-provided URL to
query the Content-Length of the response to determine the image size.
If the response is successful (not HTTP 4xx or 5xx), and contains a
Content-Length header that is divisible by the block size (any of
512, 2048, or 4096), Nexus considers the URL a valid image source, and
the image is created. A user can then create a disk from the image and
issue reads to it from an instance, which cause Propolis (the hypervisor
userspace) to make HTTP GET requests with the Range header set; if
the response is successful and has the requested Content-Length based
on the Range header, that data is sent to the instance to complete the
read operation.</p></div><div class="paragraph"><p>The above process is similar for the <code>disk_import_blocks_from_url</code>
endpoint, except that the Crucible pantry (part of the storage subsystem
that allows modification of disks while no instance is running) makes
the HTTP HEAD request, and that the Crucible pantry immediately
makes HTTP GET requests with the Range header set until all data is
read or an error condition occurs. The same requirements are necessary
for the operation to succeed; if successful, the user can attach the
disk to an instance and issue reads, which do not create additional
HTTP requests to the URL. If the operation was unsuccessful, any
partially-read data is available on the disk.</p></div><div class="paragraph"><p>Because Nexus, Propolis, and the Crucible pantry are on the underlay
network, they can make HTTP requests to any service on that network.
This allows a user to send HTTP HEAD requests to arbitrary URLs on
the underlay network; if the response to a HEAD request is successful
and contains a Content-Length header divisible by the block size, and
responses to GET requests with the Range header have a body with the
requested length divisible by the block size, the response data can be
viewed by the user.</p></div><div class="paragraph"><p>Additionally, Nexus has access to networks outside the system, to allow
users to access it and allow it to communicate with SAML providers. This
allows a user to send HTTP HEAD requests to arbitrary URLs to networks
routable from the system. These requests are performed without DNS
resolution, so a user must specify an IP address. GET requests routed
outside the system via this issue are not possible, as services making
GET requests only run on the underlay network.</p></div><div class="paragraph"><p>HTTP services on the underlay network are described in the following
sections.</p></div><div class="sect2"><h3 data-sectnum=".."><span class="anchor" id="_clickhouse" aria-hidden="true"></span><a class="link group" href="#_clickhouse">ClickHouse<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h3><div class="sectionbody"><div class="paragraph"><p>ClickHouse is used by the Oxide software to store metrics. It offers a
SQL-like query interface over HTTP, allowing queries to be passed in via
URL query parameters or a POST request body.</p></div><div class="paragraph"><p>The query interface responds to HEAD requests, but with no
Content-Length header, so reading from the query interface is not
possible. HEAD requests to this interface can run arbitrary SQL
queries; thus it is possible for a user with knowledge of the underlay
network address of the HTTP interface to tamper with data stored in
ClickHouse, either by modifying or deleting metric data or by preventing
the storage and querying of metrics altogether.</p></div><div class="paragraph"><p>The rest of the system&#8217;s availability is not affected if either
ClickHouse or the metrics system are unavailable.</p></div></div></div><div class="sect2"><h3 data-sectnum=".."><span class="anchor" id="_cockroachdb" aria-hidden="true"></span><a class="link group" href="#_cockroachdb">CockroachDB<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h3><div class="sectionbody"><div class="paragraph"><p>CockroachDB is used by the Oxide software to store all data except
metrics and data stored on disks. Its primary interface is a
PostgreSQL-compatible protocol, but by default it starts an HTTP console
on the same IP address. Prior to version 5 of the Oxide software, this
console was accessible via the underlay network.</p></div><div class="paragraph"><p>Most endpoints served by the CockroachDB console respond
406 Method Not Allowed to HEAD requests, or require a valid
session cookie. The endpoints that successfully respond to HEAD
requests provide a very limited subset of database metrics and health
information, assets for the console UI, and debug endpoints that we do
not expect can provide database contents via GET requests alone. For
data to be read from any of these endpoints, the Content-Length must
be divisible by a valid user-selected block size (512, 2048, or 4096),
and the endpoint must support Range requests.</p></div><div class="paragraph"><p>Oxide has evaluated the HTTP endpoints served by CockroachDB and could
not identify any which meet these requirements, and we are not confident
that this issue could successfully be used for information disclosure;
however, we cannot completely rule out the possibility at this time.</p></div></div></div><div class="sect2"><h3 data-sectnum=".."><span class="anchor" id="_oxide_authored_http_services" aria-hidden="true"></span><a class="link group" href="#_oxide_authored_http_services">Oxide-authored HTTP services<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h3><div class="sectionbody"><div class="paragraph"><p>The Oxide software consists of many HTTP services authored by Oxide.
These services use a common HTTP library named Dropshot. Dropshot does
not automatically handle HTTP HEAD requests, and no endpoints provided
by any Oxide-authored HTTP services handle HEAD requests. There is no
impact to these services.</p></div></div></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_additional_information" aria-hidden="true"></span><a class="link group" href="#_additional_information">Additional Information<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>There is no additional information at this time.</p></div></div></div></div>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oxide Security Advisory 20230808-1: CVE-2023-20569 AMD RAS Poisoning (Inception)]]></title>
        <id>https://docs.oxide.computer/security/advisories/20230808-1</id>
        <link href="https://docs.oxide.computer/security/advisories/20230808-1"/>
        <updated>2023-08-08T12:00:00.000Z</updated>
        <content type="html"><![CDATA[<div id="content" class="asciidoc-body release-note-doc w-full"><div id="preamble"><div class="sectionbody"><div class="paragraph"><p>Researchers from ETH Zurich have discovered a novel
<a href="https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)">Spectre
V2 variant</a> that impacts AMD Zen 1 through Zen 4 CPUs via the CPU&#8217;s
return address predictor. Researchers have called this attack
'Inception'. AMD calls this Speculative Return Stack Overflow and has
titled this
<a href="https://www.amd.com/en/resources/product-security/bulletin/amd-sb-7005.html">AMD-SN-7005
Return Address Predictor Security Notice</a>.</p></div><div class="paragraph"><p>A given hardware thread may poison the branch predictors in the CPU core
and use that to trick the CPU to access information in another context.
Oxide gimlet servers are impacted by this vulnerability. Oxide is
reviewing the guidance and expected performance impact from AMD and is
awaiting publication of the research paper which should occur on Aug 9,
2023 so we can further analyze this vulnerability and provide additional
guidance.</p></div><div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"><caption class="title"><a class="anchor" id="revision_history"></a><a href="#revision_history"><div class="title">Revision History</div></a></caption><colgroup><col style="width:33.3333%"/><col style="width:33.3333%"/><col style="width:33.3334%"/></colgroup><thead><tr><th class="tableblock halign-left valign-top">Revision</th><th class="tableblock halign-left valign-top">Date (YYYYMMDD)</th><th class="tableblock halign-left valign-top">Changes</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">1.0</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">20230808</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Initial Release</p></td></tr></tbody></table></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impacted_products" aria-hidden="true"></span><a class="link group" href="#_impacted_products">Impacted Products<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>This impacts all Gimlet Compute Sleds.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_impact" aria-hidden="true"></span><a class="link group" href="#_impact">Impact<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>An attacker in a virtual machine may be able to read privileged
information through a cache-timing side channel attack from the
hypervisor or from the guest operating sytems&#8217;s kernel that is executing
on the same thread or core as the attacker.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_action_required" aria-hidden="true"></span><a class="link group" href="#_action_required">Action Required<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>There is no immediate action required for Oxide systems. We will provide
additional updates as we better understand this situation. Any
mitigations will likely be part of the next software update. Oxide is
evaluating the isolation of indirect branch predictors as well as
reviewing what is required to ensure that guest virtual machines will
be able to properly understand this based on information that will be
released by the Linux kernel project and Microsoft.</p></div><div class="paragraph"><p>The required microcode revision for Oxide&#8217;s Gimlet systems (0x0a0011d1)
was already a part of Oxide Software Release 1.0.1.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_mitigations" aria-hidden="true"></span><a class="link group" href="#_mitigations">Mitigations<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>Reducing the number of untrusted workloads may reduce the chance of this
attack being executed. The primary means of exploitation in Oxide
products is through hardware virtual machine guests that are created
through the API.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_technical_background" aria-hidden="true"></span><a class="link group" href="#_technical_background">Technical Background<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="paragraph"><p>As part of optimizing common function calls and branches in the
processor, the hardware maintains what it calls a Return Address Stack.
When a processor executes the call instruction, it pushes the return
address on to the operating system stack and makes a note of it in
inside the processor itself. The processor-internal structure is called
the Return Address Stack (RAS). This is used because most
subroutines/function calls will return to whence they came allowing the
CPU to optimize this case. The RAS contains the full address of the
target. Only addresses that are valid in the current address space
(based on the <code>%cr3</code> register) can enter the RAS.</p></div><div class="paragraph"><p>In addition to the RAS, the CPU employs what is known as a branch target
buffer (BTB). The CPU caches the location that a branch instruction will
likely go to as part of its speculative execution engine. Put
differently, when the CPU is scanning ahead and sees a branch
instruction, it will guess on what path the program will jump to and
speculatively execute assuming that is correct. It will then later come
back and determine whether or not that is actually correct.</p></div><div class="paragraph"><p>The AMD BTB design found in Zen family CPUs does not include the full
instruction pointer inside of it, it instead includes a subset of the
address bits. This means that entries in the BTB may alias several
different virtual addresses in the CPU. Due to the aliasing, it is
possible to cause confusion inside the RAS and cause the CPU to
mispredict a return instruction.</p></div><div class="paragraph"><p>A mispredicted instruction is then, when combined with the proper
gadget, used to cause the CPU to create a side-effect in the cache that
may be observable. The RAS exists on a per-thread basis. That is, each
hardware thread has an independent return address stack. However,
depending on the CPU configuration the BTB may be shared between
hardware threads in the core. This leads to some theoretical
difficulties in performing the attack. We expect additional information
about this to be clearer when the research paper is made available.</p></div><div class="paragraph"><p>AMD is releasing a microcode update for AMD Zen 3 and Zen 4 systems that
will change the behavior of the Indirect Branch Prediction Barrier
(IBPB) MSR which is used to flush out older indirect branch predictions.
Microcode updates are not required for AMD Zen 1 and 2 systems. Existing
CPU microcode on Zen 1 and 2 systems performs all necessary flushes on
an IBPB. Proper use of IBPB when combined with the Single-thread
indirect branch predictors, can significantly mitigate this attack
according to AMD.</p></div></div></div><div class="sect1"><h2 data-sectnum=""><span class="anchor" id="_additional_information" aria-hidden="true"></span><a class="link group" href="#_additional_information">Additional Information<svg width="16" height="16" class="text-accent-secondary ml-2 hidden group-hover:inline-block"><use href="/assets/sprite-BV33W1VU.svg#link-16"></use></svg></a></h2><div class="sectionbody"><div class="ulist"><ul class=""><li><p><a href="https://www.amd.com/en/resources/product-security/bulletin/amd-sb-7005.html">AMD-SN-7005
Return Address Predictor Security Notice</a>.</p></li></ul></div></div></div></div>]]></content>
    </entry>
</feed>