<feed xmlns='http://www.w3.org/2005/Atom'>
<title>u-boot.git/net/net.c, branch v2023.04</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.</subtitle>
<id>http://cgit.235523.xyz/u-boot.git/atom/net/net.c?h=v2023.04</id>
<link rel='self' href='http://cgit.235523.xyz/u-boot.git/atom/net/net.c?h=v2023.04'/>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/'/>
<updated>2023-01-23T23:11:39Z</updated>
<entry>
<title>sandbox: Allow ethernet to be disabled at runtime</title>
<updated>2023-01-23T23:11:39Z</updated>
<author>
<name>Simon Glass</name>
<email>sjg@chromium.org</email>
</author>
<published>2023-01-17T17:47:27Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=f43b2df3e068cc7be1aa5656c0c3223e270bba63'/>
<id>urn:sha1:f43b2df3e068cc7be1aa5656c0c3223e270bba63</id>
<content type='text'>
For bootstd tests it is seldom useful to have ethernet enabled. Add a way
to disable it, so that ethernet operations like tftpboot do nothing.

Signed-off-by: Simon Glass &lt;sjg@chromium.org&gt;
</content>
</entry>
<entry>
<title>net: ipv6: Add missing break into IPv6 protocol handler</title>
<updated>2022-12-22T20:39:13Z</updated>
<author>
<name>Viacheslav Mitrofanov</name>
<email>v.v.mitrofanov@yadro.com</email>
</author>
<published>2022-12-06T07:08:16Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=0d6d5a4aa6e04bedf87793de337c05a022268041'/>
<id>urn:sha1:0d6d5a4aa6e04bedf87793de337c05a022268041</id>
<content type='text'>
IPv6 protocol handler is not terminated with a break statment.
It can lead to running unexpected code.

Signed-off-by: Viacheslav Mitrofanov &lt;v.v.mitrofanov@yadro.com&gt;
Reviewed-by: Daniel Schwierzeck &lt;daniel.schwierzeck@gmail.com&gt;
</content>
</entry>
<entry>
<title>net: ping6: Add ping6 command</title>
<updated>2022-12-05T17:47:16Z</updated>
<author>
<name>Viacheslav Mitrofanov</name>
<email>v.v.mitrofanov@yadro.com</email>
</author>
<published>2022-12-02T09:18:08Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=eeb0a2c6938226ee3c46fa66971da9231d64667d'/>
<id>urn:sha1:eeb0a2c6938226ee3c46fa66971da9231d64667d</id>
<content type='text'>
Implement ping6 command to ping hosts using IPv6. It works the same way as
an ordinary ping command. There is no ICMP request so it is not possible
to ping our host. This patch adds options in Kconfig and Makefile to
build ping6 command.

Series-changes: 3
- Added structures and functions descriptions
- Added to ping6_receive() return value instead of void

Series-changes: 4
- Fixed structures and functions description style

Signed-off-by: Viacheslav Mitrofanov &lt;v.v.mitrofanov@yadro.com&gt;
Reviewed-by: Ramon Fried &lt;rfried.dev@gmail.com&gt;
Reviewed-by: Simon Glass &lt;sjg@chromium.org&gt;
</content>
</entry>
<entry>
<title>net: tftp: Add IPv6 support for tftpboot</title>
<updated>2022-12-05T17:47:16Z</updated>
<author>
<name>Viacheslav Mitrofanov</name>
<email>v.v.mitrofanov@yadro.com</email>
</author>
<published>2022-12-02T09:18:07Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=7fbf230d79ad531e680475529191e2ec08099c7d'/>
<id>urn:sha1:7fbf230d79ad531e680475529191e2ec08099c7d</id>
<content type='text'>
The command tftpboot uses IPv4 by default. Add the possibility to use IPv6
instead. If an address in the command is an IPv6 address it will use IPv6
to boot or if there is a suffix -ipv6 in the end of the command it also
force using IPv6. All other tftpboot features and parameters are left
the same.

Signed-off-by: Viacheslav Mitrofanov &lt;v.v.mitrofanov@yadro.com&gt;
Reviewed-by: Ramon Fried &lt;rfried.dev@gmail.com&gt;
Reviewed-by: Simon Glass &lt;sjg@chromium.org&gt;
</content>
</entry>
<entry>
<title>net: ipv6: Incorporate IPv6 support into u-boot net subsystem</title>
<updated>2022-12-05T17:47:16Z</updated>
<author>
<name>Viacheslav Mitrofanov</name>
<email>v.v.mitrofanov@yadro.com</email>
</author>
<published>2022-12-02T09:18:06Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=ffdbf3bad5f3f2dd8320dc5628104d6c559cd36c'/>
<id>urn:sha1:ffdbf3bad5f3f2dd8320dc5628104d6c559cd36c</id>
<content type='text'>
Add net_ip6_handler (an IPv6 packet handler) into net_loop. Add
neighbor discovery mechanism into network init process. That is the
main step to run IPv6 in u-boot. Now u-boot is capable to use NDP and
handle IPv6 packets.

Signed-off-by: Viacheslav Mitrofanov &lt;v.v.mitrofanov@yadro.com&gt;
Reviewed-by: Ramon Fried &lt;rfried.dev@gmail.com&gt;
Reviewed-by: Simon Glass &lt;sjg@chromium.org&gt;
</content>
</entry>
<entry>
<title>net: Add wget application</title>
<updated>2022-11-28T18:06:39Z</updated>
<author>
<name>Ying-Chun Liu (PaulLiu)</name>
<email>paul.liu@linaro.org</email>
</author>
<published>2022-11-08T06:17:29Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=cfbae48219fd81f6c9e1a7b5ee160cdd3005f958'/>
<id>urn:sha1:cfbae48219fd81f6c9e1a7b5ee160cdd3005f958</id>
<content type='text'>
This commit adds a simple wget command that can download files
from http server.

The command syntax is
wget ${loadaddr} &lt;path of the file from server&gt;

Signed-off-by: Duncan Hare &lt;DuncanCHare@yahoo.com&gt;
Signed-off-by: Ying-Chun Liu (PaulLiu) &lt;paul.liu@linaro.org&gt;
Reviewed-by: Simon Glass &lt;sjg@chromium.org&gt;
Cc: Christian Gmeiner &lt;christian.gmeiner@gmail.com&gt;
Cc: Joe Hershberger &lt;joe.hershberger@ni.com&gt;
Cc: Michal Simek &lt;michal.simek@xilinx.com&gt;
Cc: Ramon Fried &lt;rfried.dev@gmail.com&gt;
Reviewed-by: Ramon Fried &lt;rfried.dev@gmail.com&gt;
</content>
</entry>
<entry>
<title>net: Add TCP protocol</title>
<updated>2022-11-28T18:06:39Z</updated>
<author>
<name>Ying-Chun Liu (PaulLiu)</name>
<email>paul.liu@linaro.org</email>
</author>
<published>2022-11-08T06:17:28Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=a3bf193bf4ea8703bcf96b1a34713fb2ae87aa39'/>
<id>urn:sha1:a3bf193bf4ea8703bcf96b1a34713fb2ae87aa39</id>
<content type='text'>
Currently file transfers are done using tftp or NFS both
over udp. This requires a request to be sent from client
(u-boot) to the boot server.

The current standard is TCP with selective acknowledgment.

Signed-off-by: Duncan Hare &lt;DH@Synoia.com&gt;
Signed-off-by: Duncan Hare &lt;DuncanCHare@yahoo.com&gt;
Signed-off-by: Ying-Chun Liu (PaulLiu) &lt;paul.liu@linaro.org&gt;
Reviewed-by: Simon Glass &lt;sjg@chromium.org&gt;
Cc: Christian Gmeiner &lt;christian.gmeiner@gmail.com&gt;
Cc: Joe Hershberger &lt;joe.hershberger@ni.com&gt;
Cc: Michal Simek &lt;michal.simek@xilinx.com&gt;
Cc: Ramon Fried &lt;rfried.dev@gmail.com&gt;
Reviewed-by: Ramon Fried &lt;rfried.dev@gmail.com&gt;
</content>
</entry>
<entry>
<title>net: deal with fragment-overlapping-two-holes case</title>
<updated>2022-11-28T18:06:39Z</updated>
<author>
<name>Rasmus Villemoes</name>
<email>rasmus.villemoes@prevas.dk</email>
</author>
<published>2022-10-17T07:52:51Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=068696863980f86504934bdb1e4d0d6359b76092'/>
<id>urn:sha1:068696863980f86504934bdb1e4d0d6359b76092</id>
<content type='text'>
With a suitable sequence of malicious packets, it's currently possible
to get a hole descriptor to contain arbitrary attacker-controlled
contents, and then with one more packet to use that as an arbitrary
write vector.

While one could possibly change the algorithm so we instead loop over
all holes, and in each hole puts as much of the current fragment as
belongs there (taking care to carefully update the hole list as
appropriate), it's not worth the complexity: In real, non-malicious
scenarios, one never gets overlapping fragments, and certainly not
fragments that would be supersets of one another.

So instead opt for this simple protection: Simply don't allow the
eventual memcpy() to write beyond the last_byte of the current hole.

Signed-off-by: Rasmus Villemoes &lt;rasmus.villemoes@prevas.dk&gt;
</content>
</entry>
<entry>
<title>net: fix ip_len in reassembled IP datagram</title>
<updated>2022-11-28T15:25:18Z</updated>
<author>
<name>Rasmus Villemoes</name>
<email>rasmus.villemoes@prevas.dk</email>
</author>
<published>2022-10-14T17:43:40Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=06653c701040f34e05d587bf14c2600f8cb3460f'/>
<id>urn:sha1:06653c701040f34e05d587bf14c2600f8cb3460f</id>
<content type='text'>
For some reason, the ip_len field in a reassembled IP datagram is set
to just the size of the payload, but it should be set to the value it
would have had if the datagram had never been fragmented in the first
place, i.e. size of payload plus size of IP header.

That latter value is currently returned correctly via the "len"
variable. And before entering net_defragment(), len does have the
value ntohs(ip-&gt;ip_len), so if we're not dealing with a
fragment (so net_defragment leaves *len alone), that relationship of
course also holds after the net_defragment() call.

The only use I can find of ip-&gt;ip_len after the net_defragment call is
the ntohs(ip-&gt;udp_len) &gt; ntohs(ip-&gt;ip_len) sanity check - none of the
functions that are passed the "ip" pointer themselves inspect -&gt;ip_len
but instead use the passed len.

But that sanity check is a bit odd, since the RHS really should be
"ntohs(ip-&gt;ip_len) - 20", i.e. the IP payload size.

Now that we've fixed things so that len == ntohs(ip-&gt;ip_len) in all
cases, change that sanity check to use len-20 as the RHS.

Signed-off-by: Rasmus Villemoes &lt;rasmus.villemoes@prevas.dk&gt;
</content>
</entry>
<entry>
<title>net: (actually/better) deal with CVE-2022-{30790,30552}</title>
<updated>2022-11-28T15:25:18Z</updated>
<author>
<name>Rasmus Villemoes</name>
<email>rasmus.villemoes@prevas.dk</email>
</author>
<published>2022-10-14T17:43:39Z</published>
<link rel='alternate' type='text/html' href='http://cgit.235523.xyz/u-boot.git/commit/?id=1817c3824a08bbad7fd2fbae1a6e73be896e8e5e'/>
<id>urn:sha1:1817c3824a08bbad7fd2fbae1a6e73be896e8e5e</id>
<content type='text'>
I hit a strange problem with v2022.10: Sometimes my tftp transfer
would seemingly just hang. It only happened for some files. Moreover,
changing tftpblocksize from 65464 to 65460 or 65000 made it work again
for all the files I tried. So I started suspecting it had something to
do with the file sizes and in particular the way the tftp blocks get
fragmented and reassembled.

v2022.01 showed no problems with any of the files or any value of
tftpblocksize.

Looking at what had changed in net.c or tftp.c since January showed
only one remotely interesting thing, b85d130ea0ca.

So I fired up wireshark on my host to see if somehow one of the
packets would be too small. But no, with both v2022.01 and v2022.10,
the exact same sequence of packets were sent, all but the last of size
1500, and the last being 1280 bytes.

But then it struck me that 1280 is 5*256, so one of the two bytes
on-the-wire is 0 and the other is 5, and when then looking at the code
again the lack of endianness conversion becomes obvious. [ntohs is
both applied to ip-&gt;ip_off just above, as well as to ip-&gt;ip_len just a
little further down when the "len" is actually computed].

IOWs the current code would falsely reject any packet which happens to
be a multiple of 256 bytes in size, breaking tftp transfers somewhat
randomly, and if it did get one of those "malicious" packets with
ip_len set to, say, 27, it would be seen by this check as being 6912
and hence not rejected.

====

Now, just adding the missing ntohs() would make my initial problem go
away, in that I can now download the file where the last fragment ends
up being 1280 bytes. But there's another bug in the code and/or
analysis: The right-hand side is too strict, in that it is ok for the
last fragment not to have a multiple of 8 bytes as payload - it really
must be ok, because nothing in the IP spec says that IP datagrams must
have a multiple of 8 bytes as payload. And comments in the code also
mention this.

To fix that, replace the comparison with &lt;= IP_HDR_SIZE and add
another check that len is actually a multiple of 8 when the "more
fragments" bit is set - which it necessarily is for the case where
offset8 ends up being 0, since we're only called when

  (ip_off &amp; (IP_OFFS | IP_FLAGS_MFRAG)).

====

So, does this fix CVE-2022-30790 for real? It certainly correctly
rejects the POC code which relies on sending a packet of size 27 with
the MFRAG flag set. Can the attack be carried out with a size 27
packet that doesn't set MFRAG (hence must set a non-zero fragment
offset)? I dunno. If we get a packet without MFRAG, we update
h-&gt;last_byte in the hole we've found to be start+len, hence we'd enter
one of

	if ((h &gt;= thisfrag) &amp;&amp; (h-&gt;last_byte &lt;= start + len)) {

or

	} else if (h-&gt;last_byte &lt;= start + len) {

and thus won't reach any of the

		/* overlaps with initial part of the hole: move this hole */
		newh = thisfrag + (len / 8);

		/* fragment sits in the middle: split the hole */
		newh = thisfrag + (len / 8);

IOW these division are now guaranteed to be exact, and thus I think
the scenario in CVE-2022-30790 cannot happen anymore.

====

However, there's a big elephant in the room, which has always been
spelled out in the comments, and which makes me believe that one can
still cause mayhem even with packets whose payloads are all 8-byte
aligned:

    This code doesn't deal with a fragment that overlaps with two
    different holes (thus being a superset of a previously-received
    fragment).

Suppose each character below represents 8 bytes, with D being already
received data, H being a hole descriptor (struct hole), h being
non-populated chunks, and P representing where the payload of a just
received packet should go:

  DDDHhhhhDDDDHhhhDDDD
        PPPPPPPPP

I'm pretty sure in this case we'd end up with h being the first hole,
enter the simple

	} else if (h-&gt;last_byte &lt;= start + len) {
		/* overlaps with final part of the hole: shorten this hole */
		h-&gt;last_byte = start;

case, and thus in the memcpy happily overwrite the second H with our
chosen payload. This is probably worth fixing...

Signed-off-by: Rasmus Villemoes &lt;rasmus.villemoes@prevas.dk&gt;
</content>
</entry>
</feed>
