Nozomi Networks Labs discovered a vulnerability affecting the Domain Name System (DNS) implementation of all versions of uClibc and uClibc-ng, a popular C standard library in IoT products.
The flaw is caused by the predictability of transaction IDs included in the DNS requests generated by the library, which may allow attackers to perform DNS poisoning attacks against the target device.
According to their respective official websites, uClibc is known to be used by major vendors such as Linksys, Netgear, and Axis, or Linux distributions such as Embedded Gentoo. uClibc-ng is a fork specifically designed for OpenWRT, a common OS for routers possibly deployed throughout various critical infrastructure sectors.
A source code review revealed that the uClibc library implements DNS requests by calling the internal “__dns_lookup”
function, located in the source file “/libc/inet/resolv.c”
.
Afterwards, the following lines of code are executed.
In reference to line #1309, at the first DNS request, the “local_id”
variable is initialized with the value of the transaction ID of the last DNS request (“last_id”
). Line #1320 is the actual core of the vulnerability: “local_id”
is updated by incrementing its old value by 1. Given that the value is initialized to 1 at the first invocation, this is the reason that the transaction ID was reset to 0x2 the previous Wireshark screenshot (Figure 2).
After doing a bitwise AND at line #1321, this value is also stored inside “last_id”
variable at line #1323. Finally, at line #1335, the value of “local_id”
is copied inside the struct resolv_header “h” variable, which represents the actual content of the header of the DNS request. Similar revisions of this code were found in all versions available of uClibc and uClibc-ng.
Vulnerability Exploitability
Given that the transaction ID is now predictable, to exploit the vulnerability an attacker would need to craft a DNS response that contains the correct source port, as well as win the race against the legitimate DNS response incoming from the DNS server. Exploitability of the issue depends exactly on these factors. As the function does not apply any explicit source port randomization, it is likely that the issue can easily be exploited in a reliable way if the operating system is configured to use a fixed or predictable source port.
If the operating system applies randomization of the source port (which is done by all OSs nowadays—for instance, modern Linux kernels use the range 32768–60999), exploitability depends on the capacity of the attacker to brute-force the 16-bit source port value by sending multiple DNS responses, while simultaneously winning the race against the legitimate DNS response. In this situation, exploitability depends on factors such as the bandwidth at disposal of the attacker, or on the response time of the DNS query. Additionally, it is more likely that an attacker will succeed at least once in performing a DNS poisoning attack if the target device performs a great number of identical queries in a given time frame, compared to a target that performs sporadic queries.
This vulnerability remains unpatched, however, Nozomi researchers are working with the maintainer of the library and the broader community in support of finding a solution.
Bijay Pokharel
Related posts
Subscribe
Cybersecurity Newsletter
You have Successfully Subscribed!
Sign up for cybersecurity newsletter and get latest news updates delivered straight to your inbox. You are also consenting to our Privacy Policy and Terms of Use.