I. Executive Summary

On September 7, the Nemo protocol was exploited, resulting in a financial loss of approximately $2.59 million. The attack's core was the concurrent exploitation of a dual vulnerability:

  1. A flash_loan function, intended for internal use, was erroneously exposed as a public function.

    After comprehensive analysis from multiple parties, the flash loan is not the primary attack vector, and actually not that relevant as the attacker could have loaned funds from somewhere else. However, it is important to clarify that it acts as an "accelerant."

  2. A query function, get_sy_amount_in_for_exact_py_out, contained a flaw that allowed for unauthorized modification of the contract's internal state.

    An in-depth investigation has traced the procedural root cause to January of this year. During the window between MoveBit's initial audit and the final revised report, a Nemo developer(The developer mentioned in this article is the same) introduced this new, unaudited feature into the codebase submitted for review. Consequently, a version of the contract containing unaudited code was deployed to the mainnet. The governance root cause was the protocol's reliance on a single-signature address for upgrades, which failed to prevent the deployment of code that had not undergone rigorous scrutiny. But the most important thing is that the version confirmed by the audit company was not used by the developer.

  3. During this period, another unfortunate development is that after receiving the notification from Asymptotic team regarding the issue with the update_current_exchange_rate function (as referenced in C-2), the developer did not attach sufficient importance to it or carry out the necessary fix. In fact, this issue could have been resolved with Asymptotic's support.

Attack Vector Analysis


II. Root Cause Analysis: How Was the Vulnerability Introduced and Deployed?


III. Fund Tracing Report