Cointime

Download App
iOS & Android

Cross-Function Reentrancy Attacks in Kadena Smart Contracts

Validated Project

In this post, we briefly explain the difference between reentrancy and cross-function reentrancy, and how Turing incompleteness can prevent some such attacks. We then provide an example of a cross-function reentrancy exploit not prevented by Turing incompleteness using Pact, the programming language utilized on the Kadena blockchain.

Introduction

Kadena is a blockchain that aims to be more scalable, more secure, and easier to use than the other Layer 1 blockchains. To program smart contracts a new language has been developed: Pact. This language is made to be human readable, easily formally verified, and, to improve security: Turing incomplete. Turing incompleteness here means roughly that the Pact language is not able to do everything a Turing complete programming language such as Solidity or Haskell can do. This could look like a downside, however when it comes to smart contract programming the need for Turing completeness is quite rare, even when developing complex DeFi protocols.

One of the most important points of Turing incompleteness is the absence of unbounded recursion. While it is true that this considerably reduces the attack surface, some “classic” attacks cannot be completely prevented, as we will soon see with the cross-function reentrancy.

Classic Reentrancy

Reentrancy attacks are very common security issues. They can be hard for developers to spot, and it can be laborious for an auditor to review all the potential consequences. Reentrancy attacks depend on the order of execution of specific tasks a function makes before and after making an external call.

If a contract calls an untrusted external contract, a malicious actor can make it repeat this function call again and again, creating a recursive call. If the reentered function performs important tasks (like updating the balance of an account) this could have disastrous consequences.

Here is a simplified example:

Let’s call the vulnerable contract, unsafe contract, and the malicious contract, Attack contract.

  1. An attacker makes a call on an unsafe contract to transfer funds to the Attack contract.
  2. Receiving the call, the unsafe contract first checks to see that the attacker has the funds, then it transfers the funds to the Attack contract.
  3. Upon receiving the funds, the Attack contract executes a fallback function which calls back into an unsafe contract before it is able to update its balance, thus restarting the process.

Because this kind of attack works through an unbounded recursive call, it is impossible to carry out if the language is not Turing complete.

Cross-Function Reentrancy

Cross-function reentrancy is similar to the classic reentrancy attack, except the function reentered is not the same as the one making the external call. This kind of reentrancy attack is usually harder to spot. In complex protocols, the number of possible combinations is huge and it may be impossible to manually test each potential outcome.

This leads us to our proof of concept: a simple cross-function reentrancy attack using the Pact language.

Simple Cross-Function Reentrancy in a Pact Module

As we will see in the following code snippets, the functions in the contract make an external call to another contract implementing a specific interface. This allows a designed attack contract to reenter. The capabilities in Pact are built-in functions that grant a user privilege to perform sensitive tasks. The following pieces of code are for illustrative purposes only, they are not taken from real case contracts.

The code example we will use has three parts:

  1. The interface:

This will be used to make the main contract interact with a malicious external module.

  1. The main module:

Here is the mock contract to be exploited.

First, a database is defined as a table where a string is stored in a row with an associated decimal number.

Then a capability is defined: CREDIT (which here is always true). This condition will be required by the credit function but is only granted by the bad_function inside the with_capability statement. This implies that calling credit directly would fail.

Now, the function credit is defined: it increases the balance (the decimal) of the string given as an input. It also creates the entry if the address is not already in the table. Finally, the function bad_function increases legit_address balance but also performs a call to a contract compliant with the interface defined before, which can be provided as an input parameter.

The function get-balance allows us to read the table.

  1. The module used to exploit the reentrancy:

It reenters the main module to call the credit function.

The general flow is as follows:

a. bad_function is called with the attack contract as a parameter

b. The capability CREDIT is granted

c. The balance of “legit_address” is increased by 10

d. external_function from the malicious module is called: because this still has the capability CREDIT, it can reenter the contract and call directly the credit function to give “attacker_address” a balance of 100.

After that (get-balance “legit_address”) returns 10 and (get-balance “attacker_address”) returns 100.

The reentrancy was successful.

Now, what happens if instead of reentering to call credit we try to reenter to call bad_function again? Then, even if the first call to credit were successful, because the reentrancy would be in bad_function this would be a recursive call and the execution would not work.

Now if instead, we try to call directly external_function, this would not work because the required capability CREDIT would not be granted.

Conclusion

By removing unbounded recursivity, Turing incompleteness can prevent some reentrancy attack vectors. However, since cross-function reentrancy can be done without a recursive call, Turing incompleteness does not prevent all such attack vectors and users should not assume that reentrancy is not a problem when interacting with this kind of language.

Reentrancy and cross-function reentrancy are very common security issues that have led to some of the most costly attacks in Web3.

Pact is a promising smart contract programming language that takes a somewhat different approach to other languages like Solidity or Haskell. Pact does not rely solely on Turing incompleteness to improve security; the language is designed to be easier to read, understand, and formally verify. However, no programming language is immune to all attack vectors. It is important for developers to be aware of the unique features of the languages they work with, and for all projects to be thoroughly audited before deployment.

Read more: https://www.certik.com/resources/blog/1eFmMTGVicfAMiPka3vaTY-cross-function-reentrancy-attacks-in-kadena-smart-contracts

Comments

All Comments

Recommended for you

  • BTC Surpasses $84,000

    Market data shows that BTC has surpassed $84,000, currently priced at $84,004.27, with a 24-hour increase of 1.25%. The market is experiencing significant volatility, so please ensure proper risk management.

  • Ethereum Foundation-Linked Wallet Transfers 4,393 ETH to Kraken Worth $11.13 Million

    On October 12, on-chain analyst Yu Jin reported that 4 hours ago, two wallets associated with the Ethereum Foundation transferred 4,393 ETH (valued at $11.13 million) to the trading platform Kraken. The wallet that sent the ETH today received 59,751 ETH from the Ethereum Foundation wallet 10 years ago, of which 49,751 ETH has been gradually transferred to Kraken over the past decade at an average price of approximately $658.

  • BTC Surpasses $84,000

    Market data shows that BTC has surpassed $84,000, currently priced at $84,035.16, with a 24-hour increase of 1.16%. The market is experiencing significant volatility, so please ensure proper risk management.

  • Zelensky Responds to Trump's Russia-Ukraine Ceasefire Statement: Ukraine Will Agree if Russia Accepts Energy Ceasefire

    According to Axios, Ukrainian President Zelensky stated that Trump's ceasefire statement was also a surprise to him. Ukraine will agree if Russia accepts an energy ceasefire.

  • CryptoBillis Ledger Attacker Deposits $3.89 Million in Crypto Assets to Binance

    On October 11, the attacker of CryptoBillis Ledger deposited approximately $3.89 million in crypto assets to Binance over the past two days, including 3.685 million USDT and 615,000 TRX (about $204,000). This attacker had previously stolen over $90 million in crypto assets. (PeckShieldAlert)

  • KillaXBT: BTC May Surge Before Midterm Elections, Drop After, Historical Probability 75% Bearish

    On October 11, Killa (@KillaXBT), a user on X, shared his perspective that the ideal path for BTC is to rise before the midterm elections, establishing a bullish narrative and surpassing previous highs. Following this, he anticipates a pullback post-election, similar to past cycles, but with higher lows instead of new cycle lows. He believes that if there is a decline before the elections, it is more likely to rise towards $95,000 afterward. Citing data, he noted that nearly $2 billion in long positions were just liquidated, with only three weeks until the midterm elections. Historically, in four midterm elections, three have seen bearish trends emerge one to two months after the elections, giving a probability of 75%. He stated that the worst-case scenario would be a price rebound leading into the elections, followed by a reversal that traps the other side before de-risking. He believes that the narrative for one side has already been liquidated, and the current exposure of shorts is higher than that of longs. The author claims to still hold 10x long positions and longs established at 62.6K and 76.4K, with all positions fully allocated and not closed. This represents his personal trading view and is not an objective event.

  • Argentine Central Bank Indicates Cryptocurrencies May Open to Banks

    On October 11, the Argentine Central Bank stated that during Milei's second term, cryptocurrencies may be opened to banks, lifting a ban that has been in place for four years.

  • Trump: Russia and Ukraine Agree to 'Energy Ceasefire'

    On October 11, U.S. President Trump announced that an 'energy ceasefire' has been reached in the Russia-Ukraine war, effective immediately. Both sides have agreed not to disrupt it.

  • CITIC Securities: Hong Kong Stocks' Fundamentals Expected to Have Bottomed Out

    On October 11, CITIC Securities' research report pointed out that for Hong Kong stocks, although the overseas interest rate hike cycle combined with the restart of AI-driven trading continues to pressure liquidity, the fundamental expectations have bottomed out, and the earnings growth expectations for major broad-based indices have begun to be revised upwards. There is a significant divergence in the adjustment of industry earnings expectations, with some specific sectors seeing upward revisions, while industries related to domestic demand still face downward pressure on earnings expectations. The upcoming third-quarter performance will be an important basis for assessing the progress of recovery. The report advises investors to maintain patience with Hong Kong stocks, expecting that short-term dividend strategies will continue to outperform.

  • Five Major U.S. TV Networks Boycott White House Coverage; DOJ Launches Antitrust Investigation

    On October 11, the U.S. Department of Justice announced it is investigating whether five television networks, including CNN, violated federal antitrust laws. This follows President Trump's ban on reporters from CNN and two other news organizations from entering the White House for coverage, prompting these five major media outlets to collectively boycott and refuse to report on White House activities in solidarity with the banned reporters. The antitrust division of the DOJ is examining CNN, NBC, CBS, Fox News, and ABC. These news organizations have formed a television broadcasting alliance to jointly cover presidential activities and share video footage. The DOJ stated that the members of this television press corps are boycotting White House coverage; such collective boycott actions among business competitors may violate the Sherman Antitrust Act. The antitrust division is investigating to determine if these news organizations have violated antitrust laws. Last month, Trump barred reporters from CNN, MS NOW, and Politico from entering the White House, citing that their coverage was unfavorable to him. Following this, major television networks suspended joint reporting. When CNN was removed from its scheduled coverage of Trump at the United Nations General Assembly, other networks refused to take its place.