Please note, this content is no longer actively maintained.
The content of the SWC registry has not been thoroughly updated since 2020. It is known to be incomplete and may contain errors as well as crucial omissions.
For currently maintained guidance on known Smart Contract vulnerabilities written primarily as guidance for security reviewers, please see the EEA EthTrust Security Levels specification. As well as the latest release version, an Editor's draft is available, that represents the latest work of the group developing the specification.
General guidance for developers on what to consider to ensure security, that is currently maintained, is also available through the Smart Contract Security Verification Standard (SCSVS).
Title
Function Default Visibility
Relationships
- CWE-710: Improper Adherence to Coding Standards
- EthTrust Security Levels:
- [Q] Code Linting
Description
Functions that do not have a function visibility type specified are public
by default. This can lead to a vulnerability if a developer forgot to set the visibility and a malicious user is able to make unauthorized or unintended state changes.
Remediation
Functions can be specified as being external
, public
, internal
or private
. It is recommended to make a conscious decision on which visibility type is appropriate for a function. This can dramatically reduce the attack surface of a contract system.
References
Samples
visibility_not_set.sol
/*
* @source: https://github.com/sigp/solidity-security-blog#visibility
* @author: SigmaPrime
* Modified by Gerhard Wagner
*/
pragma solidity ^0.4.24;
contract HashForEther {
function withdrawWinnings() {
// Winner if the last 8 hex characters of the address are 0.
require(uint32(msg.sender) == 0);
_sendWinnings();
}
function _sendWinnings() {
msg.sender.transfer(this.balance);
}
}
Comments
The function declarations in lines 11 and 17 do not set the visibility of the functions. At least for Solidity 0.4.24
(as specified in the pragma
statement), this means they will default to being treated as public
.
This allows anyone to call the _sendWinings()
function and take the money.
Instead, the fixed version below restricts the _sendWinnings()
function visibility to internal
,
so it can only be activated by the WithdrawWinnings()
function that enforces a check
whether the sender actually met the presumed conditions to receive the money.
visibility_not_set_fixed.sol
/*
* @source: https://github.com/sigp/solidity-security-blog#visibility
* @author: SigmaPrime
* Modified by Gerhard Wagner
*/
pragma solidity ^0.4.24;
contract HashForEther {
function withdrawWinnings() public {
// Winner if the last 8 hex characters of the address are 0.
require(uint32(msg.sender) == 0);
_sendWinnings();
}
function _sendWinnings() internal{
msg.sender.transfer(this.balance);
}
}