Does it read entropy from /dev/urandom to protect hash table against "Algorithmic Complexity Attacks"? Is getrandom(2) the solution? Or init API that receives entropy from caller?
On Linux, getrandom is always the right approach. The /dev/urandom and /dev/random APIs are obsolescent. They aren't always available since they require access to a populated /dev, there's the dynamic failure case from using dynamic allocation (of files) and the early init bug.
The maintainers should fix the early init security bug in /dev/urandom, but they aren't yet willing to do it based on the lackluster kernel entropy generation combined with broad deployment of broken environments not providing entropy such as poor virtual machine implementations.
To save you some trouble: We're primarily talking about Linux systems where getrandom syscall returns ENOSYS or where there is no such syscall and there getentropy and friends all open /dev/urandom.
The right approach to take when there's not supposed to be a failure case and there's no secure alternatives is to abort. The getrandom system call was introduced in 2014 with the release of Linux 3.17. I doubt the systems you're talking about receive meaningful security updates.
Preaching to the choir. But, people still ask for Android O support and somebody from Google shared some info with me about the significance of Android O deployment. Last I looked some Enterprise Linux LTS stuff still doesn't have it either.
Minimum kernel version for Android O is specified to be 3.18 even for devices that were only upgraded to Android O. Linux 3.18 is also the oldest supported LTS branch for the Android common kernel and by the downstream SoC vendors. If it's older, it's going to be insecure anyway.
Devices launched with Oreo needed to have at least Linux 4.4. The 3.18 requirement was for older devices. If the kernel version is older, it's not Android, because that's part of the Compatibility Definition Document defining what Android means. I think it's a simple decision.
The choice is whether you want to support insecure environments without proper security updates, and if you do, it's hard to see why you would be worried about hash DoS. If you want a fallback, then use AT_RANDOM, which is usually more than good enough for mitigating hash DoS.
Yes, but I guess there are Android devices without getrandom, for whatever reason, and people (developers) would rather have their app "work" on those devices (securely or not) rather than not even start. Pretty unlikely /dev/urandom isn't seeded for a normal Android app, right?