  Recent years have witnessed explosive growth in blockchain smart contract
applications. As smart contracts become increasingly popular and carry trillion
dollars worth of digital assets, they become more of an appealing target for
attackers, who have exploited vulnerabilities in smart contracts to cause
catastrophic economic losses. Notwithstanding a proliferation of work that has
been developed to detect an impressive list of vulnerabilities, the bad
randomness vulnerability is overlooked by many existing tools. In this paper,
we make the first attempt to provide a systematic analysis of random numbers in
Ethereum smart contracts, by investigating the principles behind pseudo-random
number generation and organizing them into a taxonomy. We also lucubrate
various attacks against bad random numbers and group them into four categories.
Furthermore, we present RNVulDet - a tool that incorporates taint analysis
techniques to automatically identify bad randomness vulnerabilities and detect
corresponding attack transactions. To extensively verify the effectiveness of
RNVulDet, we construct three new datasets: i) 34 well-known contracts that are
reported to possess bad randomness vulnerabilities, ii) 214 popular contracts
that have been rigorously audited before launch and are regarded as free of bad
randomness vulnerabilities, and iii) a dataset consisting of 47,668 smart
contracts and 49,951 suspicious transactions. We compare RNVulDet with three
state-of-the-art smart contract vulnerability detectors, and our tool
significantly outperforms them. Meanwhile, RNVulDet spends 2.98s per contract
on average, in most cases orders-of-magnitude faster than other tools. RNVulDet
successfully reveals 44,264 attack transactions. Our implementation and
datasets are released, hoping to inspire others.
