Erfahren Sie, wie Sie Angriffe für die Denial of Service (DOS) in intelligenten Verträgen verhindern, indem Sie sicherstellen, dass die Warteschlangen sicher sind, mit niedrigen Dezimal -Token umgehen und externe Anrufe sicher verwalten können.
Willkommen zurück in die Solodit Checklist Resolution Series. Wir werden weiterhin die Checklisten von Solodit Smart Contract Audit untersuchen und sich auf praktische Strategien für das Schreiben sicherer und belastbarer Smart -Verträge konzentrieren.
Mit dieser Checkliste können Sie potenzielle Schwachstellen identifizieren und proaktive Sicherheitsmaßnahmen implementieren. Im vorherigen Abschnitt " Solodit -Checklist -Auflösung (1) " untersuchten wir drei Checklisten ( Extraktionsmuster, Mindestübertragungsmenge und Blacklist ) im Zusammenhang mit einer Denial -of -Service -Angriff (DOS) und lieferten Lösungen für Entwickler. Wenn Sie es noch nicht gelesen haben, empfehle ich, den Artikel zu überprüfen, bevor Sie fortfahren.
In diesem Artikel werden wir drei weitere Elemente in der Checkliste diskutieren und sich erneut auf DOS -Angriffe konzentrieren. Wir werden in die Schwachstellen der Warteschlange eintauchen, die Herausforderungen von niedrigen Dezimal -Token und die Bedeutung des sicheren Umgangs mit externen Vertragsanrufen .
Öffnen Sie für die beste Erfahrung ein Solodit -Checklist als Referenz.
Hier ist, was wir heute diskutieren werden:
Sol-Am-Dosa-4: Blockierung der Warteschlange : Dieses Problem tritt auf, wenn ein Angreifer die Warteschlange manipuliert, um seine Operationen zu pausieren oder zu unterbrechen, was zu DOS führt. Wir werden uns ansehen, wie Angreifer die Verarbeitungswarteschlangen zerstören können.
Sol-Am-Dosa-5: niedrige Dezimal-Token : Probleme, die beim Umgang mit Token mit niedrigen Dezimalstellen auftreten. Die Berechnung, insbesondere die Teilung, kann auf Null abgeschnitten werden, was zu unerwartetem und schädlichem Verhalten führt. Diese Token mit niedriger Präzision können Probleme mit der Ganzzahl-Division verursachen und so die Schlüsselfunktionen stören.
SOL-AM-DOSA-6: Unsichere externe Anrufe : Wir werden untersuchen, wie man sich auf externe Verträge angewiesen hat, ohne angemessene Fehlerbehandlungen zu erstellen, um Schwachstellen zu erstellen. Wenn das Ausfall eines externen Anrufs nicht korrekt behandelt wird, kann der gesamte Vertrag zurückrollen .
Bei realen Angriffen beweisen Angriffe, wie potenzielle Schäden verursachen können, die diese Schwachstellen verursachen können. Das Projekt erlitt große Verluste aufgrund scheinbar geringfügiger Fahrlässigkeit.
Solodit-Checklisten basieren auf Audit-Erkenntnissen, Kopfgeldberichten und echten Ereignissen. Durch das Studium dieser Checklisten können Sie aus früheren Fehlern lernen und die Sicherheit Ihres Codes verbessern .
Schauen wir uns nun jeden Scheckelement eins nach dem einzeln über den Beispielcode an. Diese Beispiele wurden vereinfacht, um die Kernschwachstellen hervorzuheben.
Problem : Wenn Ihr intelligenter Vertrag von einer Warteschlange für die Aufgabenverarbeitung abhängt, kann ein Angreifer einen bestimmten Zustand in der Warteschlange manipulieren, um die korrekte Verarbeitung zu verhindern.
Checkliste Frage : "Kann ein Angreifer blockieren oder verhindern, dass die Warteschlangenverarbeitung einen Serviceausfall verursacht?"
Lösung : Ihr Warteschlangenbehandlungsmechanismus erfordert leistungsstarke Fehlerbehebung und Fallback -Mechanismen, um sicherzustellen, dass Probleme auch dann weiter bearbeitet werden können.
Beispiel :
Betrachten Sie ein Beispiel für das Extrahieren einer Warteschlange:
Der Benutzer fordert die Extraktion an, und einige Flags geben an, dass die Anforderung aktiv ist.
Der Angreifer kann die Funktion resetUserStatus
verwenden, nachdem die Extraktion eingesetzt wurde, um denselben Betrieb anderer Benutzer zu verhindern.
// 易受攻击的函数:可以被利用function resetUserStatus() external { // 任何人在仍然处于队列中的情况下都可以重置他们的状态withdrawalRequested[msg.sender] = false; // 注意:用户没有被移出队列! } // 处理队列中的下一次提取function processNextWithdrawal() external { require(withdrawalQueue.length > currentIndex, "没有可处理的提取"); // 获取下一次提取Withdrawal memory withdrawal = withdrawalQueue[currentIndex]; // 可被攻击者利用:此检查可能会被重置状态所攻击require(withdrawalRequested[withdrawal.user], "提取请求不再有效"); // 处理提取uint256 amount = withdrawal.amount; require(balances[withdrawal.user] >= amount, "余额不足"); // 更新余额balances[withdrawal.user] -= amount; // 重置提取请求withdrawalRequested[withdrawal.user] = false; // 发送资金(bool success, ) = payable(withdrawal.user).call{value:amount}(""); require(success, "资金发送失败"); // 移动到队列中的下一个currentIndex++; }
Um dies zu nutzen, kann ein Angreifer Folgendes tun:
resetUserStatus
auf.processNextWithdrawal
wird zurückrollen, was zu einem kontinuierlichen DOS -Angriff führt.Heilmittel :
withdrawalRequested
an den Administrator.Problem : Token mit niedrigen Dezimalstellen können Probleme mit ganzzahligen Divisionen verursachen und so auf Null abrufen .
Stellen Sie sich einen Token -Streaming -Vertrag vor, der über einen bestimmten Zeitraum hinweg Token zuteilt. Wenn tokensPerSecond
aufgrund der Ganzzahl -Division mit niedrigen Dezimal -Token auf Null rundet, wird die Zuordnungsfunktion blockiert. Checkliste Frage : "Führt niedrige Dezimal -Token zu DOS?" Lösung : Implementieren Sie die Logik, um niedrige Dezimalpunkte zu verarbeiten , um die Unterbrechung von Handelsprozessen aufgrund von Rundfehlern zu verhindern. Beispiel :
Betrachten Sie einen TokenStream
-Vertrag, der regelmäßig eine bestimmte Anzahl von Token an Benutzer streamt, wobei:
total_tokens
müssen in den Vertrag übertragen werdentoken_per_second
kann auf null gerundet sein, da wir Token mit einem Dezimalpunkt von 1 verwendendistributeTokens
rollt zurück contract TokenStream { IERC20 public token; uint256 public streamDuration; uint256 public tokensPerSecond; constructor(IERC20 _token, uint256 _streamDuration, uint256 _tokensPerSecond) { token = _token; streamDuration = _streamDuration; tokensPerSecond = _tokensPerSecond; } function distributeTokens(address recipient) external { uint256 balance = token.balanceOf(address(this)); uint256 amount = tokensPerSecond * streamDuration; uint256 tokensToSend = amount > balance ? balance : amount; require(tokensToSend > 0, "没有足够的代币进行流送"); token.transfer(recipient, tokensToSend); } } contract LowDecimalToken is ERC20 { constructor() ERC20("LowDecimalToken", "LDT") { _mint(msg.sender, 100000 * (10 ** decimals())); } function decimals() public view virtual override returns (uint8) { return 1; // 模拟小数点为低的代币} }
In diesem Fall werden der testDOSWithLowDecimalTokens
-Test im TokenStreamTest
zurückgerollt.
Abhilfe : Stellen Sie sicher, dass der Vertrag korrekte Dezimal -Token behandelt und die Probleme lindert, die durch die Rundung von Ganzzahlen während des Berechnungsprozesses durch Skalierung mathematischer Formeln verursacht werden .
Problem : Viele intelligente Verträge stützen sich auf externe Verträge, um zu interagieren. Das unerwartete Verhalten externer Verträge kann dazu führen, dass das gesamte System zurückrollt . Wenn Sie diese externen Fehler nicht behandeln, kann dies zu DOS -Schwachstellen führen.
Checkliste Frage : "Behandelt das Protokoll externe Vertragswechselwirkungen sicher?"
Lösung : Stellen Sie sicher, dass externe Vertragswechselwirkungen eine starke Fehlerbehandlung zum Schutz der Protokollintegrität unabhängig von der Leistung externer Verträge gewährleisten.
Beispiel : Betrachten Sie einen Vertrag, der mit einer externen Kettenlink -Preisdatenquelle interagiert. Wenn Sie Try/Catch nicht für die ordnungsgemäße Fehlerbehandlung verwenden, verbreiten sich alle Rollbacks von externen Datenquellen zum Vorgesetzten und veranlassen den Vertrag.
getPrice
-Funktion ruft Preisdaten ab.calculateSomethingImportant
-Funktionsfunktion hängt von getPrice
ab und rollt ebenfalls zurück. contract PriceDependentContract { AggregatorV3Interface public priceFeed; constructor(address _priceFeed) { priceFeed = AggregatorV3Interface(_priceFeed); } // 易受攻击的函数,在没有处理可能的Chainlink 回滚的情况下获取价格function getPrice() public view returns (uint256) { (, int256 price, , , ) = priceFeed.latestRoundData(); // 易受攻击的行:没有错误处理require(price > 0, "价格必须为正"); return uint256(price); } function calculateSomethingImportant() public view returns (uint256) { uint256 price = getPrice(); // ... 使用价格的一些重要计算return price * 2; }
Mittel : Wickeln Sie externe Vertragsanrufe in einen Versuchs-/Catch -Block ein, um Rollback -Fehler zu verarbeiten und Rollback- oder Cache -Werte zu implementieren.
Hinweis : Es gibt einen Randfall, in dem der externe Vertrag absichtlich Gas verbraucht, was auch den Fangblock nicht bestehen kann! Wir werden dies später diskutieren.
Wir untersuchen drei wichtige Überprüfungen, die die Fähigkeit Ihres Smart -Vertrags verbessern sollen, DOS -Angriffen zu widerstehen: Schwachstellen der Warteschlange , Herausforderungen im Zusammenhang mit niedrigen Dezimal -Token und die Bedeutung der sicheren Umstellung externer Vertragsinteraktionen .
Denken Sie daran, dass die angegebenen Beispiele dazu bestimmt sind, die Kernschwachstellen zu veranschaulichen. Es ist sehr wichtig , die Grundprinzipien zu verstehen und diese Konzepte an Ihre spezifischen Anwendungsfälle anzupassen.
Durch die Umsetzung dieser Vorschläge können Sie die Sicherheit und Widerstandsfähigkeit Ihrer intelligenten Verträge erheblich verbessern.
Seien Sie gespannt auf den nächsten Teil der Solodit -Checklist -Resolution -Serie.
- Original-Link: cyfrin.io/blog/solodit-c ...
- Der Assistent der Denglischen Community AI übersetzt ausgezeichnete englische Artikel für alle. Wenn es Bereiche gibt, in denen die Übersetzung nicht verständlich ist, verzeihen Sie mir bitte ~ ~