From e1d7b23fd59a24503d3c77bb9e99f5e21a3f77a2 Mon Sep 17 00:00:00 2001 From: Christian Reitter Date: Wed, 6 Dec 2023 12:34:58 +0100 Subject: [PATCH] Add blog posts no.2 and no.3, customize Jekyll. Thanks to Heiko Schaefer for proofreading and edit suggestions. Technical changes: Extend the image handling via jekyll-responsive-image and corresponding configuration & templates. This requires ImageMagick dependencies in the Dockerfile for the rmagick plugin. Add custom Jekyll Liquid filters for semi-automatic Bitcoin address and transaction formatting/linking. Add CSS details for the figure handling. --- Dockerfile | 2 +- Gemfile | 3 +- Gemfile.lock | 5 + _config.yml | 66 +++++++ _includes/responsive-image.html | 21 +++ _layouts/post.html | 2 +- _plugins/custom.rb | 10 + _posts/2023-11-22-research-update-1.md | 3 +- _posts/2023-12-06-research-update-2.md | 173 ++++++++++++++++++ _posts/2023-12-06-research-update-3.md | 65 +++++++ _sass/base.scss | 18 ++ ...ly_monthly_volume_btc_2018_2023_graph1.png | Bin 0 -> 29980 bytes ...ly_monthly_volume_btc_2022_2023_graph1.png | Bin 0 -> 30934 bytes ...let_style_ec_new_monthly_volume_graph1.png | Bin 0 -> 24890 bytes 14 files changed, 364 insertions(+), 4 deletions(-) create mode 100644 _includes/responsive-image.html create mode 100644 _plugins/custom.rb create mode 100644 _posts/2023-12-06-research-update-2.md create mode 100644 _posts/2023-12-06-research-update-3.md create mode 100644 assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2018_2023_graph1.png create mode 100644 assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2022_2023_graph1.png create mode 100644 assets/images/graphs/trustwallet_style_ec_new_monthly_volume_graph1.png diff --git a/Dockerfile b/Dockerfile index 8c94011..9ffe491 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM ruby:3.2-alpine AS builder LABEL stage=distrust-co-builder -RUN apk update && apk add g++ make +RUN apk update && apk add g++ make imagemagick imagemagick-dev imagemagick-libs RUN mkdir -p /home COPY Gemfile /home COPY Gemfile.lock /home diff --git a/Gemfile b/Gemfile index 0b9fc97..7e456e1 100644 --- a/Gemfile +++ b/Gemfile @@ -2,4 +2,5 @@ source "https://rubygems.org" # gem "jekyll-theme-console", path: "./_vendor/jekyll-theme-console" gem "jekyll" -gem "jekyll-feed" \ No newline at end of file +gem "jekyll-feed" +gem "jekyll-responsive-image" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 3be741a..d799e99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -33,6 +33,9 @@ GEM webrick (~> 1.7) jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) + jekyll-responsive-image (1.6.0) + jekyll (>= 2.0, < 5.0) + rmagick (>= 2.0, < 5.0) jekyll-sass-converter (3.0.0) sass-embedded (~> 1.54) jekyll-watch (2.2.1) @@ -54,6 +57,7 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) rexml (3.2.5) + rmagick (4.3.0) rouge (4.1.2) safe_yaml (1.0.5) sass-embedded (1.63.6) @@ -73,6 +77,7 @@ PLATFORMS DEPENDENCIES jekyll jekyll-feed + jekyll-responsive-image BUNDLED WITH 2.4.17 diff --git a/_config.yml b/_config.yml index f51374d..dda33e6 100644 --- a/_config.yml +++ b/_config.yml @@ -39,6 +39,7 @@ footer: '2023' plugins: - jekyll-feed + - jekyll-responsive-image # Build settings @@ -64,3 +65,68 @@ exclude: - "*.conf" - "README.md" - "LICENSE" + + + +responsive_image: + # Path to the image template. + template: _includes/responsive-image.html + + # [Optional, Default: 85] + # Quality to use when resizing images. + default_quality: 90 + + # [Optional, Default: []] + # An array of resize configuration objects. Each object must contain at least + # a `width` value. + # Keep in sync with minima.scss width levels, in pixel + sizes: + - width: 600 # [Required] How wide the resized image will be. + quality: 85 # [Optional] Overrides default_quality for this size. + - width: 1150 + + # [Optional, Default: false] + # Rotate resized images depending on their EXIF rotation attribute. Useful for + # working with JPGs directly from digital cameras and smartphones + auto_rotate: false + + # [Optional, Default: false] + # Strip EXIF and other JPEG profiles. + strip: true + + # [Optional, Default: assets] + # The base directory where assets are stored. This is used to determine the + # `dirname` value in `output_path_format` below. + base_path: assets/images + + # [Optional, Default: assets/resized/%{filename}-%{width}x%{height}.%{extension}] + # The template used when generating filenames for resized images. Must be a + # relative path. + # + # Parameters available are: + # %{dirname} Directory of the file relative to `base_path` (assets/sub/dir/some-file.jpg => sub/dir) + # %{basename} Basename of the file (assets/some-file.jpg => some-file.jpg) + # %{filename} Basename without the extension (assets/some-file.jpg => some-file) + # %{extension} Extension of the file (assets/some-file.jpg => jpg) + # %{width} Width of the resized image + # %{height} Height of the resized image + # + output_path_format: assets/images/resized/%{width}/%{basename} + + # [Optional, Default: true] + # Whether or not to save the generated assets into the source folder. + save_to_source: false + + # [Optional, Default: false] + # Cache the result of {% responsive_image %} and {% responsive_image_block %} + # tags. See the "Caching" section of the README for more information. + cache: false + + #/ [Optional, Default: []] + # By default, only images referenced by the responsive_image and responsive_image_block + # tags are resized. Here you can set a list of paths or path globs to resize other + # images. This is useful for resizing images which will be referenced from stylesheets. + # extra_images: + # - assets/foo/bar.png + # - assets/bgs/*.png + # - assets/avatars/*.{jpeg,jpg} \ No newline at end of file diff --git a/_includes/responsive-image.html b/_includes/responsive-image.html new file mode 100644 index 0000000..51b4eed --- /dev/null +++ b/_includes/responsive-image.html @@ -0,0 +1,21 @@ + +{% capture srcset %} +{% for i in resized %} + /{{ i.path }} {{ i.width }}w, +{% endfor %} +{% endcapture %} + +{% assign smallest = resized | sort: 'width' | first %}^ + +{% if figure -%} +
+{% if target_width -%} + {{ alt }} +{% else -%} + {{ alt }} +{% endif -%} +
{% if caption %}{{ caption }}{% else %}{{ alt }}{% endif %}
+
+{% else -%} +{{ alt }} +{% endif -%} diff --git a/_layouts/post.html b/_layouts/post.html index 51c52d3..bae204c 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -11,8 +11,8 @@ layout: default {%- if page.last_modified_at -%} {%- assign mdate = page.last_modified_at | date_to_xmlschema -%} +
{%- endif -%} -
{%- if page.author -%} {% for author in page.author -%}{%- assign author_count = author_count | plus: 1 -%}{% endfor %} {%- if author_count==1 -%} diff --git a/_plugins/custom.rb b/_plugins/custom.rb new file mode 100644 index 0000000..e7b6e1f --- /dev/null +++ b/_plugins/custom.rb @@ -0,0 +1,10 @@ +module LinkBitcoin + def BtcLinkTxUrlSliced(input) + "[#{input.slice(0,8)}..#{input.slice(-8,8)}](https://mempool.space/tx/#{input})" + end + def BtcLinkAddressUrlFull(input) + "[#{input}](https://mempool.space/address/#{input})" + end +end + +Liquid::Template.register_filter(LinkBitcoin) \ No newline at end of file diff --git a/_posts/2023-11-22-research-update-1.md b/_posts/2023-11-22-research-update-1.md index dd94311..8e0cf12 100644 --- a/_posts/2023-11-22-research-update-1.md +++ b/_posts/2023-11-22-research-update-1.md @@ -1,6 +1,6 @@ --- layout: post -title: "Research Update No. 1 - New bx Data, ETH, Service Changes" +title: "Update #1 - New bx Data, ETH, Service Changes" author: ["Christian Reitter"] date: 2023-11-23 00:00:00 +0000 last_modified_at: 2023-12-02 16:00:00 +0000 @@ -41,6 +41,7 @@ Additional notes: * We scanned the 15 word (160 bit) and 21 word (224 bit) BIP39 seed ranges, but found them empty, at least on the common paths. While `bx mnemonic-new` can create those variants of the BIP39 standard, they are not so common. This result is therefore plausible to us. * In the [original writeup]({% link disclosure.md %}#searching-for-wallets---implementation), we outlined that many of the `3`-prefix BIP49 wallets in the 256 bit range likely belong to the same entity. One of the earliest transactions for this seems to be [3931b570..4f501910](https://mempool.space/tx/3931b570e562a58608f9b7f7291d12a40dbe617112c721077e441d264f501910) on 2018-10-03, and many similar transfers to weak wallets in this range happen within the next few days, some with identical transaction amounts. + ## Breaking Weak bx 3.x ec-new Private Keys During the initial research sprint towards understanding and reproducing the `bx` PRNG weakness, we focused on code paths and usage variants that run weak `bx seed` entropy through `bx mnemonic-new` to generate BIP39 mnemonics. BIP39 is the de facto standard for interoperability with other hardware and software wallets for many years now, and was the mechanism used by the affected wallet owners who kicked off our research, which is why we saw this as the most relevant and important variant. diff --git a/_posts/2023-12-06-research-update-2.md b/_posts/2023-12-06-research-update-2.md new file mode 100644 index 0000000..a48400d --- /dev/null +++ b/_posts/2023-12-06-research-update-2.md @@ -0,0 +1,173 @@ +--- +layout: post +title: "Update #2 - Trust Wallet Ranges, Uncompressed Pubkeys" +author: ["Christian Reitter"] +date: 2023-12-06 11:00:00 +0000 +--- + +While researching the weak entropy generated by `bx` using the Mersenne Twister algorithm, we learned fairly quickly that the generation algorithm is only a minor code change away from re-creating the weak wallets of the `Trust Wallet` software. Naturally, we spent some time in the last months to see which weak wallets we could summon from the cryptographic realms ๐Ÿ”ฎ๐Ÿช„. +There is a lot to tell about new discoveries that resulted from this, so we'll start by presenting some initial statistics and descriptions about the over 2700 weak wallet private keys in these new areas. + +
+

Table of Contents

+* placeholder +{:toc} +
+ +## New Research: Trust Wallet-like BIP39 Range + +In our original technical writeup, we mentioned the Trust Wallet vulnerability and the [surprising similarities](]({% link disclosure.md %}#not-even-the-second-hack-mersenne-twister-use-in-trust-wallet)) between the `bx seed`-generated weak keys and the Trust Wallet-generated weak keys. There is just one minor algorithmic change in the Pseudo Random Number Generator (PRNG) steps to get weak entropy for one or the other. + +So we started crunching away on the numbers to find the weak Trust Wallet accounts. + +Here is a basic overview of discovered wallet usage on Bitcoin: + +| BIP39 entropy bit length
_mnemonic length_ | 128 bit
_12 words_ | 192 bit
_18 words_| 256 bit
_24 words_| +| -- | -- | -- | -- | -- | -- | -- | +| `m/44'/0'/0'/0/0` path, compressed pubkey, P2PKH | 215 | 1 | 22 | +| `m/44'/0'/0'/0/0` path, uncompressed pubkey, P2PKH | 0 | 0 | 0 | +| `m/49'/0'/0'/0/0` path, P2WPKH | 1969 | 0 | 12 | +| `m/84'/0'/0'/0/0` path, P2SH-P2WPKH | 412 + 1 | 1 | 2 | +| -- | -- | -- | -- | -- | -- | -- | +| -- | -- | -- | -- | -- | -- | -- | +| sum of unique wallet private keys | 2580 | 2 | 36 | + +
+Data details (click to unfold) +* Wallet generation: "Trust Wallet" style MT19937-32 PRNG, PRNG -> BIP39 -> BIP32. +* 15 wallets with 128 bit mnemonics used more than one known derivation path. +* The first deposit into this range happens 2018-04-13. +

+ +Overall, we found **2618** wallets in this range so far. +As far as we know, the weak PRNG implementation that Trust Wallet temporarily used for new wallets only generates _128 bit (12 word) BIP39 mnemonics_, and many of the discovered wallets predate the introduction of the flaw into the Trust Wallet software. Therefore, it seems another wallet generation software uses exactly the same flawed PRNG method! + +We expected this, since Ledger Donjon remarked on this as well in [their writeup](https://blog.ledger.com/Funds-of-every-wallet-created-with-the-Trust-Wallet-browser-extension-could-have-been-stolen/) from April 2023: + +> During our investigations, we also noticed that a few addresses were vulnerable while they had been generated a long time before the Trust Wallet release. That probably means this vulnerability exists in some other wallet implementations which is concerningโ€ฆ + +If we look at just the wallets based on 12 word mnemonics between the time of the Trust Wallet vulnerability disclosure and now, the picture is as follows. An (unclear) portion of the "outgoing" funds represents the thefts: + +{% responsive_image_block %} + figure: true + path: assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2022_2023_graph1.png + alt: "Historic aggregated usage of known 128 bit Trust Wallet-style Bitcoin wallets, focused on 6/2022 to 9/2023" + target_width: 950px +{% endresponsive_image_block %} + +That's a decent amount of volume overall: somewhere on the order of 90 BTC which plausibly belong to Trust Wallet users were moved in and out of those wallets. The movements correspond to about 2400 individual transactions (not shown). + +However, if we zoom out, things get even more interesting: + +{% responsive_image_block %} + figure: true + path: assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2018_2023_graph1.png + alt: "Historic aggregated usage of known 128 bit Trust Wallet-style Bitcoin wallets, 2018 to 2023" + target_width: 950px +{% endresponsive_image_block %} + +From late 2018 to late 2021, this wallet range was very actively used, with on the order of **975 BTC** flowing in and out, distributed over >21300 individual transactions. The Trust Wallet-related funds on the right show the scale of this prior usage, although the Bitcoin price also changed drastically over this whole time period, which affected the amounts as well. + +From what we know so far, the most plausible explanation for us is that some other, unknown, wallet software was flawed, and millions of dollars in Bitcoins were stored insecurely. However, no one noticed in time to steal them before they were spent normally ๐Ÿ˜ตโ€๐Ÿ’ซ. + +Based on our current data, we suspect the most costly Bitcoin part of the Trust Wallet hack happened on 2023-01-11, when about 200 consecutive transfers moved out about **50 BTC** worth within a 30 minute window. Please consider this as an early estimate, especially considering that the corresponding dollar value would be multiple times higher than the `approximately $170000 USD` figure [given](https://community.trustwallet.com/t/browser-extension-wasm-vulnerability-postmortem/750787) by the Trust Wallet team in April 2023 as part of their post-mortem. + +
+List of suspicious withdrawal transactions (click to unfold) + +Selection of ten most significant Bitcoin transactions in the suspicious time frame: + +| Transaction | Volume | approx. USD @ tx time | Date | +| - | - | - | - | +| {{ "a2a028d97fe533a6a8ef098e3b70630a1ae97434d48b5218c81b07a26d469fb4" | BtcLinkTxUrlSliced }} | -16,060 BTC | -$280.036 | 2023-01-11 20:23:58 | +| {{ "185aa60cce80e85513560c847413e4fa0bfa29e61ff88ab2a386bffd53d3e739" | BtcLinkTxUrlSliced }} | -8,574 BTC | -$149.502 | 2023-01-11 20:23:58 | +| {{ "23a52b1d1c05238f7e4024016e3e26e100280295afef5ea6489a0c612717279a" | BtcLinkTxUrlSliced }} | -3,439 BTC | -$59.959 | 2023-01-11 20:23:58 | +| {{ "f774e14a59e8e74bc5cf4b654952370ae3306488f9a1c536421e0178f73b6efa" | BtcLinkTxUrlSliced }} | -2,133 BTC | -$37.195 | 2023-01-11 20:23:58 | +| {{ "d9781bc91fed709959f198a09f019883fd5626420cf10b9af07c54ddf6366c41" | BtcLinkTxUrlSliced }} | -1,579 BTC | -$27.532 | 2023-01-11 20:23:58 | +| {{ "caabba1b67a0c18ac0e483d6dc5376b25f46a4018a45cca9f8af69152c90d1c8" | BtcLinkTxUrlSliced }} | -1,346 BTC | -$23.475 | 2023-01-11 20:23:58 | +| {{ "8941e9c3f840a41da7e992d981cc4c2861a8b061656a00cd3677b413d6d0b1ce" | BtcLinkTxUrlSliced }} | -1,002 BTC | -$17.473 | 2023-01-11 20:23:58 | +| {{ "104a98c192de7dae1ed43a3d88bcb00d339ea0e7fac5aaf7e5d75ac231a9f14e" | BtcLinkTxUrlSliced }} | -0,897 BTC | -$15.643 | 2023-01-11 20:05:26 | +| {{ "66cfaa0c16748b4e4e266b99bda83a44c0e4ebd201a13b888c43a9c5789b99e8" | BtcLinkTxUrlSliced }} | -0,570 BTC | -$9.947 | 2023-01-11 20:23:58 | +| {{ "464fd34bc5ceb77fa9376e0537eb00cee07a66d37390fd7fdf6b90cbb53f3cc3" | BtcLinkTxUrlSliced }} | -0,524 BTC | -$9.138 | 2023-01-11 20:23:58 | + +
+
+ +There's more to tell here, and we'll talk more about this range of weak wallets in a future blog post. + +## New Research: Trust Wallet-like ec-new Range + +After finding clear evidence of other wallet software using the same flawed "Trust Wallet"-style of consuming Mersenne Twister MT19937 entropy, we extended our search to the special BIP39-less wallet generation mode that we saw used with `bx` [previously]({% link _posts/2023-11-22-research-update-1.md %}#bx_ec_new_keys). To describe this range, we're referring to it as _Trust Wallet_-like, in terms of Mersenne Twister output usage, and _`ec-new`_-like in the basic key generation pattern. However, note that the discovered wallets may not relate to either software, and mostly pre-date Trust Wallet's temporary use of the weak PRNG mechanism for wallet generation. +Without knowing what other wallet software was involved, this is the next best naming scheme we picked. + +Discovered Bitcoin wallets: + +| entropy bit length | 128 bit | 192 bit | 256 bit | 2048 bit | +| -- | -- | -- | -- | -- | +| number of wallets
`m/` path, compressed pubkey, P2PKH | 1 | 84 | 1 | 2 | +| number of wallets
`m/` path, uncompressed pubkey, P2PKH | 0 | 8 | 0 | 0 | + +In summary, we found **96** of these wallets so far. + +
+Data details (click to unfold) +* Wallet generation: "Trust Wallet" style MT19937-32 PRNG, PRNG -> BIP32. +* As with the `bx` `ec-new` range, we spotted an unusual outlier that went beyond the normal 256 bit of key size. In the `ec-new` BIP32 usage mode, there is no clear standard on how large or small private keys are allowed to be, but an 2048 bit secp256k1 key is still unusual. If the wallet owners had hoped for some additional security protection, they were clearly disappointed: this wallet is based on the same weak 32 bits of PRNG seeding as the others, unfortunately. +* We did not find any wallets in the following bit length range variations: 160 bit, 224 bit, 384 bit, 512 bit, 1024 bit, 4096 bit while searching for compressed public key P2PKH wallets on the base path. +

+ +Looking at the on-chain facts for these wallets (discovered so far), we can see that: +* The first deposit into this range happens 2017-04-21. +* The highest overall available aggregated balance was available from mid-2019 to late-2019 with ca. **101.25** BTC. +* Overall, an estimated **110.85 BTC** total moved through the weak wallets of this range across their history (this number may miss or double-count some funds). +

+ +Movement of funds on discovered Bitcoin wallets: +{% responsive_image_block %} + figure: true + path: assets/images/graphs/trustwallet_style_ec_new_monthly_volume_graph1.png + alt: "Historic volume for the known 'Trust Wallet ec-new'-type Bitcoin wallets (aggregated)" + target_width: 800px +{% endresponsive_image_block %} + +There are a series of 10 transactions around 2020-11-22 which abruptly move out near **93 BTC**, close to all of the remaining assets in this range at the time. We're unclear if this is a legitimate withdrawal or an early theft based on re-calculated weak private keys, but it looks very sudden and comprehensive. + +It's possible that multiple large wallets belonged to the same person and they moved it out during Bitcoin's price historic price increase that year. A deliberate theft doesn't really fit the overall time line of the other weak wallet ranges - this is two years "too early" for the known weak wallet thefts, and there is no corresponding large movement of funds on other weak ranges we found during our initial checks. +Additionally, patterns in some of the stored amounts (2.75 - 3.0 BTC each) suggest that a significant percentage of them were controlled by a single source. + +
+List of fast withdrawal transactions (click to unfold) + +| Transaction | Volume | Date | +| - | - | - | +|{{ "2cca73bc90cb64c28775ab8c59e9b3e69afe2d7772a659f5a0cc5d38901033a2" | BtcLinkTxUrlSliced }} | -6.817 BTC | 2020-11-22 20:04 | +|{{ "d834b727cb821803126eb107928bab7c0bb73a7cc92076685b840a19cce083b6" | BtcLinkTxUrlSliced }} | -64.307 BTC | 2020-11-22 20:04 | +|{{ "8660e093dd7ad2ae2597c448a099117e9c516b73cd871f9a06cdf49b076bbc4c" | BtcLinkTxUrlSliced }} | -3.5 BTC | 2020-11-22 20:04 | +|{{ "c52d0e905cdfd4b89f6e29bcec44ff6b61d80c0e72bbe1d36762519207e1720e" | BtcLinkTxUrlSliced }} | -8.0 BTC | 2020-11-22 20:04 | +|{{ "08ed7b0f5b5588ba96f17215580a49a919ecc00e1393ea546f747a45870d9b2f" | BtcLinkTxUrlSliced }} | -6.035 BTC | 2020-11-22 20:04 | +|{{ "a9b32f33ce85b5b154f85fd2b454b7930b1579c89640a1930d07d02b06c7bd77" | BtcLinkTxUrlSliced }} | -0.023 BTC | 2020-11-22 20:07 | +|{{ "4bb53fda37654b5c49a2c545faab3da5d2334e72bcd51daeebc312a8d9c76edd" | BtcLinkTxUrlSliced }} | -0.017 BTC | 2020-11-22 20:07 | +|{{ "6b898c39865a5794744648c819ba244405d4b45a77176d1d9e58742c219e7a1c" | BtcLinkTxUrlSliced }} | -2.0 BTC | 2020-11-22 20:07 | +|{{ "93f9a63e9ddb7c840061a106271f8ddbe239402b43998aba0ed84faed802377c" | BtcLinkTxUrlSliced }} | -0.64 BTC | 2020-11-22 20:07 | +|{{ "1e4065feda31adcf952ee7c7ba789fe9c99fd962fdbc590d6187d4f760d460ac" | BtcLinkTxUrlSliced }} | -1.54 BTC | 2020-11-22 20:07 | + +
+
+ +## Uncompressed Public Keys on P2PKH + +During recent work, we noticed that our wallet searches for Pay-To-Public-Key-Hash (P2PKH) addresses had assumed the public key to be in _compressed_ form (33 byte length). This is the modern and common way to generate P2PKH addresses from derived public keys. However, it is not the only way - there is a second canonical form which calculates the hash over the public key in _uncompressed_ form (65 byte length), which results in a different hash and therefore different address. + +We've done some new searches to cover these variants and found a few previously missed wallets, mostly in `ec-new`-style ranges. The [previous blog post]({% link _posts/2023-11-22-research-update-1.md %}) has also been updated with the new data. + +For some context on how those could be generated originally, the `bx` [ec-to-public](https://github.com/libbitcoin/libbitcoin-explorer/wiki/bx-ec-to-public) command in the special `bx ec-to-public --uncompressed` mode could have been involved, at least on the [bx ec key range]({% link _posts/2023-11-22-research-update-1.md %}#bx_ec_new_keys). Other wallet software may have similar legacy address encoding settings. + +## Summary & Outlook + +In this post, we provided some impact details relating to the publicly known Trust Wallet vulnerability, as well as new data on an older, not widely reported or researched wallet software vulnerability in the same BIP39 128 bit range. Similarly, we have shown some statistics and details of wallets in the related ec-new range, which most likely also come from a yet unknown wallet software vulnerability. +Finally, we described a less common but relevant Bitcoin Pay-To-Public-Key-Hash address variant that is useful to know for wallet search operations of this type. + +We're working on new topics around the Trust Wallet-related weak wallet ranges. The next blog post will focus more on the development and data source side of our work. +Check out our [RSS]({% link feed.xml %}) feed if you want to get notified by your favorite reader application. + +
\ No newline at end of file diff --git a/_posts/2023-12-06-research-update-3.md b/_posts/2023-12-06-research-update-3.md new file mode 100644 index 0000000..5d66d7d --- /dev/null +++ b/_posts/2023-12-06-research-update-3.md @@ -0,0 +1,65 @@ +--- +layout: post +title: "Update #3 - Bloom Filter, Dataset, Canaries" +author: ["Christian Reitter"] +date: 2023-12-06 11:10:00 +0000 +--- + +This research update has some information on the Bloom filter mechanism and public blockchain address data we used to find weak Bitcoin wallets. Using this technique, we were able to check several billion of potential wallets for actual usage on the blockchain without running a Bitcoin full node, or flooding other Bitcoin servers and APIs with excessive network requests. + +We also describe some artificially created wallets that we've placed to track the real-world theft behavior in one of the weak ranges. + +
+

Table of Contents

+* placeholder +{:toc} +
+ +## Bloom Filter Explanation and Address Data Source + +When searching through billions of algorithm-generated data chunks that could reveal a few interesting private keys, efficient filtering becomes very important. In our original publication, [we briefly described]({% link disclosure.md %}#searching-for-wallets---implementation) this as follows: + +> We used a publicly available list of all Bitcoin addresses historically seen by the Bitcoin network and constructed a bloom filter with a very low false positive rate on the data set. Using this filter, we were able to do quick address lookups to query and discard many unused wallet candidates, for which the relevant derived accounts were never seen by the network, without doing costly lookups to a Bitcoin full node. + +A [Bloom filter](https://en.wikipedia.org/wiki/Bloom_filter) is a special data structure that provides quick lookup checks against previously added elements. Unlike a [hash table](https://en.wikipedia.org/wiki/Hash_table) or other common lossless read-access-optimized list structures, the Bloom filter deliberately trades off some lookup accuracy for space-efficiency. This make lookup in RAM possible for datasets that would otherwise be too large. Depending on the settings used when creating the filter structure and inserting items, the lookup will falsely detect an item as being in the original set - a false positive - for a certain percentage of queries. In return for this negative effect, only a fraction of the original data footprint has to be kept in memory. This was very attractive for us for optimization reasons. + +In the first days of our research, we experimented with a Python Proof-of-Concept to test out this data structure for our tasks. After converging on Rust as the main language for our tooling, the [bloomfilter](https://github.com/jedisct1/rust-bloom-filter) crate became our tool of choice. This library is very fast, but fairly minimal, and doesn't have a built-in mechanism to export and import pre-generated Bloom filter files from disk. For this reason, we wrote some serialization code to do this for us, as seen in [published code](https://git.distrust.co/milksad/lookup/src/branch/main/bloom-filter-generator) for the `bloom-filter-generator` and its [use](https://git.distrust.co/milksad/lookup/src/branch/main/mnemonic-hash-checker/src/bloom.rs) in the lookup server process. For the research code, we're using the [Rayon](https://github.com/rayon-rs/rayon) library to parallelize our worker threads, which are able to use a single Bloom filter object to avoid memory duplication, which is important when dealing with multiple dozen threads. + +To check if the wallet addresses we derived from the generated weak private keys were previously used, we need a collection of addresses that were used on-chain, ideally covering every address ever seen publicly. For a blockchain like Bitcoin which has a long history and frequent changes of receive/change addresses, this is a lot of data. We considered using only addresses seen after a certain date (such as the first `bx` code commit with the vulnerable mechanism). But we had some resources to spare, and decided against this additional restriction, to ensure we wouldn't miss other wallet keys that were older than expected or from other generation sources. + +The most comprehensive and up-to-date public collection of Bitcoin Mainnet addresses that we could find to build our filter is from `blockchair.com`, via [https://blockchair.com/dumps](https://blockchair.com/dumps). Due to download speed limits and the split nature of the data, we did not use this download source directly. Instead, we went with a derivative of this data. + +User `LoyceV` from the `bitcointalk.org` forum distributes regularly updated data sets assembled from the individual `blockchair.com` data dump snippets via [http://alladdresses.loyce.club/](http://alladdresses.loyce.club/), as far as as we've understood from [public forum posts](https://bitcointalk.org/index.php?topic=5254914.0). This was just what we needed for Bitcoin, and a valuable resource to kickstart our research, so we're thankful it's publicly hosted without any barriers ๐Ÿ‘. + +Our `all_Bitcoin_addresses_ever_used_sorted.txt.gz` list snapshot from ca. 2023-08-01, which we used for our initial searches, comes in at ca. 42 Gigabytes in uncompressed form and has ca. 1.19 billion individual Bitcoin addresses. The corresponding Bloom filter that we built from it reduced this to ca. 7.3 Gigabytes in size (with a 0.00000000001 false positive factor for searches), which is far less data to keep in RAM. These numbers should explain why we are interested in a fast lookup mechanism with reduced memory footprint compared to the original data. Since false positives are still annoying to deal with in later processing stages, we've further reduced the false positive factor in our later research by `100x`, which has worked out quite well. + +Going forward, we would like to extend our search to some other selected coins, but are still looking for recently updated, comprehensive data collections that are publicly available. +If you're aware of public and well-maintained address/pubkey/pubkey-hash collections for Ethereum and other popular coins, we would love to hear from you [directly]({% link index.md %}#contact)! + +## Canary Wallet Observations + +Very early into the `bx` vulnerability discovery, one of our team members deliberately moved small amounts of Bitcoin onto known vulnerable `bx seed -b 256 | bx mnemonic-new` generated wallet private keys. At this point, we already understood the main weakness and could deliberately generate specific weak keys, but did not yet have custom tooling to search through the vulnerable range. Setting up a some "canary" wallets with a few dollars in Bitcoin each was therefore a cheap and simple way to gather data on the behavior of attackers. + +One of our questions was: are attacker now actively watching the vulnerable range for _new deposits_, and quickly acting upon them? +At least for the `bx` BIP39 range with 24 mnemonic words and our used paths, this was not the case initially. By the time of publication of this new blogpost, all of the four sub-wallets have been emptied, though: + +| PRNG ID | derivation path | address | original deposit | theft transaction | theft date | +| -- | -- | -- | -- | -- | +| `0x000001f4` | `m/44'/0'/0'/0/0` | {{ "13KqxkrmsPKy8gyYwochCQTuPHC7Lp8bFU" | BtcLinkAddressUrlFull }} | $5 | {{ "ff8c6822846d835e5a476bf268ab4ddba396d476f0f1b5301eea62c6acfa9c3a" | BtcLinkTxUrlSliced }} | 2023-08-23 01:23 | +| `0x000001f4` | `m/0/0` | {{ "1NxkqwmsQMTqv4SrggPv4vGHDzJKR52S2f" | BtcLinkAddressUrlFull }} | $5 | {{ "256b6b987af466b4239048272534167a0e7d197f0c3fa716c1ba24fee3f3a851" | BtcLinkTxUrlSliced }} | 2023-08-27 12:20 | +| `0xffffffff` | `m/44'/0'/0'/0/0` | {{ "1HQR3nKaDahAFrPHMoDVdWiMNFGFb7cHA5" | BtcLinkAddressUrlFull }} | $5 | {{ "48354a8bee5cb71eccb725b501f43e6351823a1d4d6dcdd1033214335b18a3d5" | BtcLinkTxUrlSliced }} | 2023-09-30 09:07 | +| `0xffffffff` | `m/0/0` | {{ "16pQhPkBa5puwEzudZVyKtsrugLtA87cy" | BtcLinkAddressUrlFull }} | $1 | {{ "8d09a736a442f87f7f31c691c068a8e526f67093250720de83b028c4ed1f03cd" | BtcLinkTxUrlSliced }} | 2023-10-01 22:16 | + +Considering the date of deposit after the main 2023-07-12 theft, low per-wallet funds and theft dates, the thieves sweeping the funds are likely not related to the main attacker. It's still interesting to see that even a weak wallet with as little as $1 in BTC gets emptied sooner or later. The sharks are clearly in the water now ๐Ÿฆˆ. + +Note that the `m/0/0` derivation path we used is an older pattern, and rare - we haven't found other `bx`-generated Bitcoin wallets in this range. Attackers may have looked into some of these unusual paths more exhaustively just for these particular wallet PRNG IDs after discovering some usage via the more common M44 P2PKH standard path pattern. + +## Summary & Outlook +In this post, we introduced a combination of data structure and data set that we successfully used to look up large numbers of addresses. +Additionally, we listed some previously internal information about deliberately created weak wallets and related theft patterns. + +We still have a long backlog of research topics to present here. We'll try to get the next post ready before the holidays ๐ŸŽ + +Check out our [RSS]({% link feed.xml %}) feed if you want to get notified by your favorite reader application. + +
\ No newline at end of file diff --git a/_sass/base.scss b/_sass/base.scss index d184fee..c7b34f2 100644 --- a/_sass/base.scss +++ b/_sass/base.scss @@ -204,3 +204,21 @@ blockquote { background: rgba(0, 0, 0, 0.3490196078); padding: 14px 25px 1px 25px; } + +figure > img { + display: block; + margin-left: auto; + margin-right: auto; + } + + figcaption { + text-align: center; + margin-top: 0.5em; + margin-bottom: 0.5em; + } + + figure { + margin-bottom: 1em; + margin-left: 0; + margin-right: 0; + } \ No newline at end of file diff --git a/assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2018_2023_graph1.png b/assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2018_2023_graph1.png new file mode 100644 index 0000000000000000000000000000000000000000..a478b079455724b6feae68fcbc3d3dabc66c04ad GIT binary patch literal 29980 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
6=CMt}#uvmW*-NZH5eV&-u?1lA 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 literal 0 HcmV?d00001 diff --git a/assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2022_2023_graph1.png b/assets/images/graphs/trustwallet_style_bip39_128bit_only_monthly_volume_btc_2022_2023_graph1.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bbb7a66404bfc8774d9b37a1a8808ce322a72c GIT binary patch literal 30934 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 literal 0 HcmV?d00001 diff --git a/assets/images/graphs/trustwallet_style_ec_new_monthly_volume_graph1.png b/assets/images/graphs/trustwallet_style_ec_new_monthly_volume_graph1.png new file mode 100644 index 0000000000000000000000000000000000000000..44b200ce41f1521494c8c91bad91f7543b5e917f GIT binary patch literal 24890 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