On Apr 21, 2021, at 11:58 AM, Ben Schwartz <bemasc=40google....@dmarc.ietf.org<mailto:bemasc=40google....@dmarc.ietf.org>> wrote:
On Wed, Apr 21, 2021 at 1:24 PM Wellington, Brian <bwelling=40akamai....@dmarc.ietf.org<mailto:40akamai....@dmarc.ietf.org>> wrote: Yes, I think that sentence should be changed. I’d suggest removing the "malformed SvcParamValues” part, but others may disagree. I agree that a URL is a tricky case. The spec writer might not want to include an ABNF representation of a valid URL, because implementors would likely want to use existing facilities to parse URLs, which are likely not consistent. In that case, though, I would expect the spec to indicate that the field is a bytestring, and the resolver to be able to that. The fact that it’s a URL is something that the client should be checking. But surely by this standard all fields are bytestrings? They’re all sequences of bytes, sure. But all of the defined parameters do have syntactic structure, and resolvers should be allowed to do the same level of syntactic checking for SVCB/HTTPS records as they do for records of other types. If there’s checking which is clearly out of the scope of the document (like URL validation), that is fundamentally different than checks like “the IPv6 address is 16 bytes”. For the existing parameters, there are checks that can (and should) be made; that IPv4 addresses, IPv6 addresses, and ports are of appropriate length, that the ALPN field has the right length prefix, and that the mandatory field is ordered and has a valid length. There are also checks which are not specified, and which a client may want to do, but are not part of the record format itself. I wouldn’t expect a recursive resolver to reject a record containing an ipv4hint with the address 255.255.255.255, but that doesn’t mean that a client should try to connect to it. It sounds like you are suggesting that we distinguish between "how the resolver should parse the value" and "how the client should parse the value" ... but the value is meaningless to the resolver, so there is no particular sense in which the resolver should parse it. This is not like JSON, where an intermediary might check that the value of the "url" key is a string, without checking whether it is a valid URL. All SvcParamValues are opaque bytestrings unless you know how to parse them. Again, there is a difference between syntax and semantics. The resolver should be allowed to check that something conforms to the syntax specified in the spec, even if it doesn’t use the value. Resolvers do not use the contents of most DNS record types, other than the ones which are used part of the DNS protocol itself (NS, A, AAAA, and the DNSSEC records). That does not mean that it shouldn’t check the formats of other known records when possible. I do not think that it should be required that a resolver is able to convey malformed records, where malformed is (only) referring to the syntactic content. That’s not how resolvers work for other types; no resolvers have options to allow 5 byte A records. Similarly, there's no requirement here that resolvers be able to convey a syntactically invalid SvcParams structure (i.e. truncated TLV). The requirement is that resolvers are, in general, able to convey records even if a SvcParamValue does not appear to be valid according to the key's specification. This is particularly relevant for multipurpose codebases that can act as both recursive and authoritative (or client). Such codebases must contain full SvcParam validation logic for all recognized SvcParamKeys, but they must be able to bypass it in recursive mode to avoid ossification. This is absolutely not true. Once the format of an rdata type (or a subtype, like an SVCB parameter) is defined, it must not change. The authors of this spec surely know this, as there was a lot of discussion about the incompatibility of the echconfig->ech change, and how something like this could never happen in a standardized type. A correctly implemented resolver should never reject a valid parameter as invalid, and if there is a need to change what the definition of a valid parameter is, that requires defining a new parameter type. This is not a requirement that resolvers always pass through these invalid values, and in many cases (e.g. "port") the validation is sufficiently trivial that enforcing it poses minimal compatibility risk. However, I think this is worth highlighting because, in my own implementation, it was easiest to enforce full validation for all recognized keys (present and future) during recursive resolution, and some extra effort was required to make sure that invalid values could pass through. It’s a requirement that recursive resolvers introduce new behavior to allow the avoidance of format validation for SVCB records. You’re free to implement that in your own code, but it’s an onerous requirement for other implementors. Changing the text to: Recursive resolvers MUST be able to convey SVCB records with unrecognized SvcParamKeys, and MAY be able to convey SVCB records with malformed SvcParamValues. would be fine with me, and I’d ignore the MAY part. Brian On Apr 21, 2021, at 10:00 AM, Ben Schwartz <bemasc=40google....@dmarc.ietf.org<mailto:bemasc=40google....@dmarc.ietf.org>> wrote: On Wed, Apr 21, 2021 at 12:44 PM Wellington, Brian <bwelling=40akamai....@dmarc.ietf.org<mailto:40akamai....@dmarc.ietf.org>> wrote: I’m not a fan of the new text in section 4.3: Recursive resolvers MUST be able to convey SVCB records with unrecognized SvcParamKeys or malformed SvcParamValues. It is perfectly reasonable for a recursive resolver to reject any malformed DNS record. There’s a significant difference between “malformed” and “unknown”. A recursive resolver should definitely allow records with unknown SvcParamKeys, but if the format of a record is known, a resolver should be allowed (encouraged, in fact) to check that it conforms to that format. The concern here was about differing interpretations of future standards. For example, if some SvcParamValue is defined as a URL (for some future key), implementations are likely to disagree about whether certain bytestrings are valid URLs. (There are several definitions and a zillion edge cases.) The resolver has no use for these values, so the most compatible behavior is to treat them as opaque bytestrings. We very deliberately chose the phrase "MUST be able to convey" to recognize that resolvers might be configured not to convey a record with a malformed value, but it should be possible. Do you think we should change this sentence?
_______________________________________________ DNSOP mailing list DNSOP@ietf.org https://www.ietf.org/mailman/listinfo/dnsop