Sonntag, 13. August 2017

Gridcoin - The Bad

In this post we will show why Gridcoin is insecure and probably will never achieve better security. Therefore, we are going to explain two critical implementation vulnerabilities and our experience with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core developer in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 responsible disclosure. 
    In our last blog post we described cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gridcoin architecture and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design vulnerability we found and fixed (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good). Now we come to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of responsibly disclosing our findings and try to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two implementation vulnerabilities (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bad).

    Update (15.08.2017):
    After cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 talk at WOOT'17 serveral ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r developers of Gridcoin quickly reached out to us and told us that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a change in responsibility internally in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gridcoin-Dev team. Thus, we are going to wait for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir response and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n change this blog post accordingly. So stay tuned :)

    Update (16.08.2017):
    We are currently in touch with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole dev team of Gridcoin and it seems that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are going to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next release.


    TL;DR
    The whole Gridcoin currency is seriously insecure against attacks and should not be trusted anymore; unless some developers are in place, which have a profound background in protocol and application security.

    What is Gridcoin?

    Gridcoin is an altcoin, which is in active development since 2013. It claims to provide a high sustainability, as it has very low energy requirements in comparison to Bitcoin. It rewards users for contributing computation power to scientific projects, published on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BOINC project platform. Although Gridcoin is not as widespread as Bitcoin, its draft is very appealing as it attempts to  eliminate Bitcoin’s core problems. It possesses a market capitalization of $13,530,738 as of August cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 4th 2017 and its users contributed approximately 5% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 total scientific BOINC work done before October 2016.

    A detailed description of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gridcoin architecture and technical terms used in this blog post are explained in our last blog post.

    The Issues

    Currently cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are 2 implementation vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code, and we can mount cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following attacks against Gridcoin:
    1. We can steal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 block creation reward from many Gridcoin minters
    2. We can efficiently prevent many Gridcoin minters from claiming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir block creation reward (DoS attack)
    So why do we not just open up an issue online explaining cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems?

    Because we already fixed a critical design issue in Gridcoin last year and tried to help cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new issues. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not seem to have an interest in securing Gridcoin and thus leave us no ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r choice than fully disclosing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 findings.

    In order to explain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities we will take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current Gridcoin source code (version 3.5.9.8).

    WARNING: Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 high number of source code lines in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source files, it can take a while until your browser shows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right line.

    Stealing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BOINC block reward

    The developer implemented our countermeasures in order to prevent our attack from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last blog post. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y did not look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir implementation from an attacker's perspective. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y would have found out that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y conduct not check, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last block hash really is done over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last block hash. But we come to that in a minute. First lets take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code flow:

    In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 figure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 called-by-graph can be seen for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function VerifyCPIDSignature.
    1. CheckBlock → DeserializeBoincBlock [Source]
      • Here we deserialize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BOINC data structure from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first transaction
    2. CheckBlock → IsCPIDValidv2 [Source]
      • Then we call a function to verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 block. Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 massive changes over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last years, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are 3 possible verify functions. We are interested in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last one (VerifyCPIDSignature), for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason that it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current verification function.
    3. IsCPIDValidv2 → VerifyCPIDSignature [Source]
    4. VerifyCPIDSignature → CheckMessageSignature [Source, Source]
    In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last function cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real signature verification is conducted [Source]. When we closely take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function parameter, we see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message (std::string sMsg)  and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature (std::string sSig) variables, which are checked. But where does this values come from?


    If we go backwards in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function call graph we see that in VerifyCPIDSignature cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sMsg is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string sConcatMessage, which is a concatenation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sCPID and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sBlockHash.
    We are interested where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sBlockHash value comes from, due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that this one is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only changing value in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature generation.
    When we go backwards, we see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value originate from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deserialization of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BOINC structure (MiningCPID& mc) and is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variable mc.lastblockhash [Source, Source]. But wait a second, is this value ever checked whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real last block hash?

    No, it is not....

    So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y just look if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stored values cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re end up in a valid signature.

    Thus, we just need to wait for one valid block from a researcher and copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last block hash value, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID and adjust every ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r dynamic value, like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RAC. Consequently, we are able to claim cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reward of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r BOINC users. This simple bug allows us again to steal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reward of every Gridcoin researcher, like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was never a countermeasure.

    Lock out Gridcoin researcher
    The following vulnerability allows an attacker under specific circumstances to register a key pair for a CPID, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID was previously tied to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r key pair. Thus, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker locks out a legit researcher and prevent him from claiming BOINC reward in his minted blocks.

    Reminder: A beacon is valid for 5 months, afterwards a new beacon must be sent with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same public key and CPID.

    Therefore, we need to take a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions, which process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beacon information. Every time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a block, which contains beacon information, it is processed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following way (click image for higher resolution):


    In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 figure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 called-by-graph can be seen for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function GetBeaconPublicKey.
    We now show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code path:
    • ProcessBlock → CheckBlock [Source]
    • CheckBlock → LoadAdminMessages [Source]
    • LoadAdminMessages → MemorizeMessages [Source]
    • MemorizeMessages → GetBeaconPublicKey [Source]
    In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last function GetBeaconPublicKey cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are different paths to process a beacon depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time since both were associated to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.
    For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following explanation we assume that we have an existing association (bound) between a CPID A and a public key pubK_A for 4 months.
    1. First public key for a CPID received [Source]
      • The initial situation, when pubK_A was sent and bind to CPID  A (4 months ago)
    2. Existing public key for a CPID was sent [Source]
      • The case that pubK_A was resent for a CPID A, before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 5 months are passed by
    3. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r public key for a CPID was sent [Source]
      • The case, if a different public key pubK_B for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID A was sent via beacon.
    4. The existing public key for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID is expired
      • After 5 months a refresh for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 association between A and pubK_A is required.
    When an incoming beacon is processed, a look up is made, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re already exists a public key for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beacon. If yes, it is compared to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beacon (case 2 and 3).
    If no public key exists (case 1) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new public key is bound to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID.

    If a public key exists, but it was not refreshed directly 12.960.000 seconds (5 months [Source]) after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last beacon advertisement of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key and CPID, it is handled as no public key would exist [Source].

    Thus, case 1 and 4 are treated identical, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public key is expired, allowing an attacker to register his public key for an arbitrary CPID with expired public key. In practice this allows an attacker to lock out a Gridcoin user from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 minting process of new blocks and furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker to claim reward for BOINC work he never did.

    There is a countermeasure, which allows a user to delete his last beacon (identified by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPID) . Therefore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user sends 1 GRC to a special address (SAuJGrxn724SVmpYNxb8gsi3tDgnFhTES9) from an GRC address associated to this CPID [Source]. We did not look into this mechanism in more detail, because it only can be used to remove our attack beacon, but does not prevent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack.

    The responsible disclosure process

    As part of our work as researchers we all have had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pleasure to responsible disclose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 findings to developer or companies.

    For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons that we wanted to give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer some time to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design vulnerabilities, described in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last blog post, we did not issue a ticket at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gridcoin Github project. Instead we contacted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer at September cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 14th 2016 via email and got a response one day later (2016/09/15). They proposed a variation of our countermeasure and dropped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advertising beacon, which would result in furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r security issues. We sent anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r email (2016/09/15) explained to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, why it is not wise to change our countermeasures and drop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 signature in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advertising beacon.
    Unfortunately, we did not receive a response. We tried it again on October cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 31th 2016. They again did not respond, but we saw in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source code that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y made some promising changes. Due to some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r projects we did not look into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code until May 2017. At this point we found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two implementation vulnerabilities. We contacted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer twice via email (5th and 16th of May 2017) again, but never received a response. Thus, we decided to wait for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WOOT notification to pass by and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n fully disclose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 findings. We thus have no ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r choice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n to say that:

    The whole Gridcoin cryptocurrency is seriously insecure against attacks and should not be trusted anymore; unless some developers are in place, which have a profound background in protocol and application security.

    Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Reading
    A more detailed description of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gridcoin architecture, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old design issue and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fix will be presented at WOOT'17. Some days after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conference cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper will be available online.

    Beliebte Posts