[Acme] Re: Potential issues with dns-persist-01
Shiloh Heurich <shiloh@heurich.com> Fri, 17 April 2026 11:39 UTC
Return-Path: <shiloh@heurich.com>
X-Original-To: acme@mail2.ietf.org
Delivered-To: acme@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 2A254DE33727 for <acme@mail2.ietf.org>; Fri, 17 Apr 2026 04:39:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1776425995; bh=cyj8Ekgnoi6J+Lfqrtc+Kg3qqwT2Uqi0j04uO1EpFBY=; h=Subject:From:In-Reply-To:Date:Cc:References:To; b=oj5htyFzc+IHrnjnBFRqW2DV+LzujwC8gBjye3VGmiBhqUEkxdpHRyLHUH9cqrekS NNaEJQlgBspG4Zx42DV33RgrvqxM/MIa8933kuW2ReeHlk2r5jw8hrxSvy7xcE2NoZ NODSDso3X4LtOSRst7cycdjI5aTxI0LUSrK8sOGA=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.099
X-Spam-Level:
X-Spam-Status: No, score=-2.099 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, TVD_PH_BODY_ACCOUNTS_PRE=0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=heurich.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KcfrKt1FViWE for <acme@mail2.ietf.org>; Fri, 17 Apr 2026 04:39:54 -0700 (PDT)
Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 8FCC2DE3371F for <acme@ietf.org>; Fri, 17 Apr 2026 04:39:54 -0700 (PDT)
Received: by mail-qv1-xf44.google.com with SMTP id 6a1803df08f44-8a210c813f8so4018106d6.0 for <acme@ietf.org>; Fri, 17 Apr 2026 04:39:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=heurich.com; s=google; t=1776425994; x=1777030794; darn=ietf.org; h=to:references:message-id:content-transfer-encoding:cc:date :in-reply-to:from:subject:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=4YPlbKfN1rmYW3XzttwWh9M1InkZ5r3xhjyDYkA5tP4=; b=DUx4VDztXPj6J3rAI63iVOg7fukCfxyzP0vjJgl3lWPfxP/ZC+gSTr4rJR7fUIUKtw EZV4tGhnrQeBId0HFajRv0USsaf47yrswpQEQSOequdB9mM0HGAGUZcxSdrh8FybL7Jt hVYBSnN7OoVXYDoE8wIRpsXWt0cDve+Yg1+2r5xN6uqAj93TRW5jFDPP8TXAi/AuV1jr 8xF2meI9JOwnZgHgnM0EPhAG4Sya3waDjBSq7o7z4XwEedTClDswd5pD0L+qSC8Cn7HY VYwcNRFbqDwbzWwu7Hz78SQjHNXThVW3BH8di3EWPpWVFaf8qtK32s1PSf5FNk+vKvZa b0Hw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776425994; x=1777030794; h=to:references:message-id:content-transfer-encoding:cc:date :in-reply-to:from:subject:mime-version:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=4YPlbKfN1rmYW3XzttwWh9M1InkZ5r3xhjyDYkA5tP4=; b=KLJPofuOjEDw/r59ukTbFdLtzOl2D8XNGzNodUKG+eBxDVewYYplQlEJHmvTeKKLZp GexutQRd2UcSvbYATiMlzuOBwDg/+WLpM3FPLibejd66LWLD5QVhpF1m2QivhntgkPoj ATa6bDH5YrzYPqRR+qWLaduC7PUnlvT4522DTaz9pn3a5lTUGdj8fOSwpLh8rOa/vBy9 wgaqAiGosdqSVPMnQRHZofp1q4PjfBDzfm2GzCrUDDzm0mW8rvKmWV5c1VGCU3sW/nOx PZtPPq5dzQE89IkebEvTAlzLiuu+7uaWOYwABX2F03SdPj60rbx63riN4ERD/KyGe8Ys tR1w==
X-Forwarded-Encrypted: i=1; AFNElJ+o98L95Pv3goG4LO32FwwmtPb3jhdXAEHJhNRMwkHwqDmdYsvdi7dB+2JfoVMbbvWoUTQ/@ietf.org
X-Gm-Message-State: AOJu0YwQL/fTKSRsNTq8UeEnYOmBVD2B7MHo7whhpRqViOH9zvvahim2 QuxTCfvLSFSpwnAUF8nv1uD1rTjo1z5a/FOhqrwrlvNAlV6zmrjQWKeZT7NOrBvvOiM=
X-Gm-Gg: AeBDietAqWIX15aKZTe5H7Hppp7k4ewDw+gGsPKmfxWA4H94v+eJ4zcyKKEL0rEZGAc RKoQ9NllSWA4GyHpAx9HeZRKfHAaoqzRrVIV3AM2Cd/9ew4TLGTeLrVStm75r7ULRMQq0cjFfMi om1vGmtgWtys6hpnn+SjUQjrHbrjV+uk9Pn9BZwRI0NI2Q6Z5rBj6WWTDxrx79hcfn2EWj3wkVv nnseZ2Vlu4dMErpDJkOaS2EC8CVh461uO86EmfzBO2QTNm+9iPTJ1zMRijTSIpTDPrKI1qxPQwa 9ErY2JdJCyLna9YXTrld5dzqQfQoRjG097Ina+07kuf/JuUw/79FpsrY1vK/BOHs23t3DppLi4A urQzisn3/zf8A3Xv3uz1t9ZJCdXEYOxBdFJQp1maDMx9WoZD4wdgmaRo7zHB0rU4KuB00ZzJm6K VS+jbeGJF1eeT+u0Ht6Sisba/LGHHi7cduqkf7diuSKOsPClWwLJvg1Q==
X-Received: by 2002:a05:6214:2465:b0:8ac:5631:7bfb with SMTP id 6a1803df08f44-8b0280ecddcmr38087896d6.30.1776425993988; Fri, 17 Apr 2026 04:39:53 -0700 (PDT)
Received: from smtpclient.apple ([216.245.86.140]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8b02ae7d79esm8534186d6.36.2026.04.17.04.39.53 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Apr 2026 04:39:53 -0700 (PDT)
Content-Type: text/plain; charset="utf-8"
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.500.181\))
From: Shiloh Heurich <shiloh@heurich.com>
In-Reply-To: <CAEmnErdOBBzj+5nuZBYo0zN64zMXDeX-3sdcFBQqJirmHky2gA@mail.gmail.com>
Date: Fri, 17 Apr 2026 07:39:42 -0400
Content-Transfer-Encoding: quoted-printable
Message-Id: <0548587B-B211-4BC9-8F4F-51F30EC555E0@heurich.com>
References: <CAFg2froJTxp+kT_VdSuNs9LVqFQhO-WJZBt=-qoVQO9c8M+=Xw@mail.gmail.com> <CAEmnErdOBBzj+5nuZBYo0zN64zMXDeX-3sdcFBQqJirmHky2gA@mail.gmail.com>
To: Aaron Gable <aaron=40letsencrypt.org@dmarc.ietf.org>
X-Mailer: Apple Mail (2.3864.500.181)
Message-ID-Hash: YJODBD6OLFPBRFHAAPAVYUYUPAV4BZTF
X-Message-ID-Hash: YJODBD6OLFPBRFHAAPAVYUYUPAV4BZTF
X-MailFrom: shiloh@heurich.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-acme.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: zandoodle <maxoscarhearnden@gmail.com>, acme@ietf.org
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Acme] Re: Potential issues with dns-persist-01
List-Id: Automated Certificate Management Environment <acme.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/acme/sysUk4TyQyR3acWDDMZnOltOpHM>
List-Archive: <https://mailarchive.ietf.org/arch/browse/acme>
List-Help: <mailto:acme-request@ietf.org?subject=help>
List-Owner: <mailto:acme-owner@ietf.org>
List-Post: <mailto:acme@ietf.org>
List-Subscribe: <mailto:acme-join@ietf.org>
List-Unsubscribe: <mailto:acme-leave@ietf.org>
> On Apr 6, 2026, at 14:40, Aaron Gable <aaron=40letsencrypt.org@dmarc.ietf.org> wrote: >> On Sat, Apr 4, 2026 at 6:47 PM zandoodle <maxoscarhearnden@gmail.com> wrote: >> • An attacker sets up an ACME server and convinces the client to use it, the client is then provided the attacker's ACME account on the CA's domain and instructs the client to setup dns-persist-01 under the attacker's account. >> • An attacker sets up an ACME server and convinces the client to use it, the client is then provided the attacker's ACME account for the attacker's domain and instructs the client to setup dns-persist-01 under the attacker's account. This requires that the certificate authority allows accounts to be created under the attacker's domain e.g. creating the account under the domain in the Host header field as done by Let's Encrypt. > > A few notes here: > > First, these two scenarios are essentially identical. In both of them, the attacker is merely providing an attacker-controlled account URI to the victim client, to get them to populate it in a DNS record. The only difference with the second scenario is that the victim client operator would see that their directory URL and account URL have the same domain name, and might be less likely to notice that something weird is going on. > > Second, the second of these scenarios doesn't actually work, at least not against Let's Encrypt. Although we reflect the Host: header in API responses, we only respect the canonical AccountURI for the purpose of CAA and dns-persist-01 accounturi=. A client that populates a TXT record with `accounturi=malicious.ca/acme/acct/12335` would not be able to complete validation. > > Finally, the fundamental threat model here was already considered and mitigated in RFC 8555. One can imagine a similarly-positioned malicious ACME proxy-esque server which intercepts an HTTP-01 challenge and replaces the `token` with one of its own. However, the attacker still can't get the victim client to successfully complete validation because the necessary value presented by the client to complete the challenge consists of two pieces of information: the token (provided by the server) and the Key Authorization (computed directly by the client). The victim client can't be fooled into computing a Key Authorization for the malicious proxy's key. > > So the solution here is to do the same. The dns-persist record should contain a piece of information computed directly by the client, rather than merely provided by the (potentially malicious) server. So I agree with Sebastian's suggestion that the record format should support an `accountkey=` parameter. Your analogy to the http-01 token substitution is correct. In the standard challenge flow, the dns-persist record contains no client-computed cryptographic material, so the same class of attack applies. RFC 8555 §10.2 describes this pattern formally and explains why Key Authorization was designed to prevent it. The draft should address this. Pre-provisioning is a different story and the thread hasn't raised it. In that flow there's no challenge object. The client constructs the record from its own account URL (the §7.3 Location header) and the `issuer-domain-name` from directory metadata or the CP/CPS. No server-provided value to substitute. This is the primary deployment model for the enterprise and multi-tenant cases the draft targets. The harder problem is that persistence and key binding work against each other. Key Authorization works for http-01 and dns-01 because those values are ephemeral: provision, validate, remove, rotate the key freely. A persistent record containing Thumbprint(accountKey) means every key rotation (§7.3.5) invalidates every dns-persist record across every domain on the account. For subscribers with hundreds or thousands of domains, that defeats the purpose of a persistent method. The draft chose accounturi because it's stable across rotations. Persistence, cryptographic key binding, key rotation support: pick two. That's the core tension. I see three options, roughly by disruption level: (a) Strengthen client verification within the current design. Upgrade the §3.1 SHOULD to MUST when the client knows its own account URL. Add explicit security analysis of the missing dual-channel binding and the rationale. Qualify the "strong binding" language in §7.2. (b) Add an optional accountkey= parameter carrying base64url(Thumbprint(accountKey)), always self-computed by the client. When present, the CA verifies the thumbprint matches the current key. Restores dual-channel binding when used, but clients accept that rotation means updating DNS records. The forward-compatibility rule (MUST ignore unknown parameters) means existing implementations won't enforce it, so this only helps against CAs that opt in. (c) Sebastian's pubkey: scheme in accounturi. Max already noted the problem: a malicious server can tell the client its accounturi is pubkey:<attacker-thumbprint>. Always-self-compute as a mitigation requires the client to distinguish pubkey URIs it should compute from regular URIs it should provision as-is. That seems fragile. I'd go with (a) for -02, possibly (b) as a follow-on. But the real question for the WG is whether the pre-provisioning distinction is sufficient, or whether the standard challenge flow needs cryptographic binding even at the cost of rotation compatibility. Shiloh
- [Acme] Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 Seo Suchan
- [Acme] Re: Potential issues with dns-persist-01 Sebastian Robin Nielsen
- [Acme] Re: Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 Aaron Gable
- [Acme] Re: Potential issues with dns-persist-01 Sebastian Robin Nielsen
- [Acme] Re: Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 Sebastian Robin Nielsen
- [Acme] Re: Potential issues with dns-persist-01 Sebastian Robin Nielsen
- [Acme] Re: Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 Sebastian Robin Nielsen
- [Acme] Re: Potential issues with dns-persist-01 Shiloh Heurich
- [Acme] Re: Potential issues with dns-persist-01 Seo Suchan
- [Acme] Re: Potential issues with dns-persist-01 Shiloh Heurich
- [Acme] Re: Potential issues with dns-persist-01 Shiloh Heurich
- [Acme] Re: Potential issues with dns-persist-01 Sebastian Robin Nielsen
- [Acme] Re: Potential issues with dns-persist-01 zandoodle
- [Acme] Re: Potential issues with dns-persist-01 Shiloh Heurich
- [Acme] Re: Potential issues with dns-persist-01 Aaron Gable