radius_xlat chops embedded NULs in cisco-av-pair

Arran Cudbard-Bell a.cudbardb at freeradius.org
Mon Mar 31 13:42:17 CEST 2014


On 31 Mar 2014, at 07:00, Kiril <kyrmail at gmail.com> wrote:

> Hi,
> there is a problem under freeradius 2.1.12 when incoming radius packet
> has embedded NUL bytes in the middle of the string attribute
> cisco-av-pair
> in debug packet output it is printed as Cisco-AVPair =
> "release-source=\000\000\000\002"
> but when we use %{Cisco-AVPair[*]} in sql accounting query it is
> expanded as "release-source="
> in previous version 1.x the bahaviour was different - xlat-ed string
> in query was shown as in debug output
> 
> according to RFC 2869 section 5 it is said:
> "Servers and servers and clients MUST be able to deal with embedded
> nulls. RADIUS implementers using C are cautioned not to use strcpy()
> when handling strings."

You might want to fully read the RFC before quoting it.

RFC 2865 states:

      Note that none of the types in RADIUS terminate with a NUL (hex
      00).  In particular, types "text" and "string" in RADIUS do not
      terminate with a NUL (hex 00).  The Attribute has a length field
      and does not use a terminator.  Text contains UTF-8 encoded 10646
      [7] characters and String contains 8-bit binary data.  Servers and
      servers and clients MUST be able to deal with embedded nulls.
      RADIUS implementers using C are cautioned not to use strcpy() when
      handling strings.

      The format of the value field is one of five data types.  Note
      that type "text" is a subset of type "string".

      text      1-253 octets containing UTF-8 encoded 10646 [7]
                characters.  Text of length zero (0) MUST NOT be sent;
                omit the entire attribute instead.

      string    1-253 octets containing binary data (values 0 through
                255 decimal, inclusive).  Strings of length zero (0)
                MUST NOT be sent; omit the entire attribute instead.

In RFC2865 speak a string is binary data, which FreeRADIUS deals with
fine. strcpy and variants will never be used on attributes of type
octets (which is the FR type which maps to 'string').

I'll grant you that "Servers and servers and clients MUST be able to
deal with embedded nulls." is ambiguous as to whether it's referring 
to strings or text or both, but this is later clarified in the same
paragraph with "RADIUS implementers using C are cautioned not to 
use strcpy() when handling strings.

> and radius_xlat function uses strlcpy(out, vp->vp_strvalue, outlen) in
> vp_prints_value, so not the full string vp->vp_strvalue is copied

But that's not the problem. The string (RFC type 'text') should be 
escaped before being added to the concatenation buffer. I'll take
a look and see if it's fixed in later versions. It'll almost certainly
work fine in 3.0.2.

Arran Cudbard-Bell <a.cudbardb at freeradius.org>
FreeRADIUS Development Team

FD31 3077 42EC 7FCD 32FE 5EE2 56CF 27F9 30A8 CAA2

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 881 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freeradius.org/mailman/private/freeradius-users/attachments/20140331/c099f662/attachment.pgp>


More information about the Freeradius-Users mailing list