solium-plugin-security

0.1.1 • Public • Published

The official Security Plugin for Solium

Build Status

This Plugin provides security-focused lint rules for Solium.

The rules have been taken from Consensys' Recommended Smart Contract Practices and Solium's Rule Wishlist.

Installation

NOTE: If you're using Solium v1.0.1 or above, this plugin comes pre-installed as a local dependency and you can skip this section.

npm install -g solium-plugin-security

Usage

NOTE: If you've installed Solium v1.0.1 or above and created soliumrc.json using solium --init, you can skip this step since solium automatically applies the security plugin for you.

Add security to your soliumrc.json's plugins array. Your configuration file should look like:

{
    "extends": "solium:all",
    "plugins": ["security"],
    "rules": {
        ...
    }
}

List of rules

Below are the rules supplied by this plugin and the information on passing options to them and their auto-fixing capabilities.

Some of them aren't always desirable and are therefore disabled by default (marked below as OFF). You should explicitly enable them in your .soliumrc.json.

Name Description Options Defaults Fixes
no-throw Discourage use of 'throw' statement for error flagging YES
no-tx-origin Discourage use of 'tx.origin' global variable
enforce-explicit-visibility Encourage user to explicitly specify visibility of function YES
no-block-members Discourage use of members 'blockhash' & 'timestamp' (and alias 'now') of 'block' global variable List of members to warn against ["blockhash", "timestamp"]
no-call-value Discourage use of .call.value()()
no-assign-params Disallow assigning to function parameters
no-fixed Disallow fixed point types
no-inline-assembly Discourage use of inline assembly
no-low-level-calls Discourage the use of low-level functions - call(), callcode() & delegatecall() List of functions to warn against ["call", "callcode", "delegatecall"]
no-modify-for-iter-var Discourage user to modify a for loop iteration counting variable in the loop body
no-send Discourage the use of unsafe method 'send'
no-sha3 Encourage use of 'keccak256()' over 'sha3()' function YES
no-unreachable-code Disallow unreachable code
OFF else-after-elseif Encourage user to use else statement after else-if statement
OFF enforce-loop-bounds Encourage use of loops with fixed bounds
OFF enforce-placeholder-last Enforce that the function placeholder is the last statement in the modifier
OFF return-at-end Discourage use of early returns in functions
OFF one-break-per-loop Discourage use of multiple breaks in while/for/do loops
OFF max-statements-in-func Enforce upper limit on number of statements inside a function Maximum number of statements 25
OFF no-abstract-func Discourage use of abstract functions
OFF no-bit-operations Disallow bitwise operations
OFF no-continue Discourage use of 'continue' statement
OFF no-inheritance Discourage use of inheritance Disallow interface inheritance { "no-interface": false }
OFF no-multiple-inheritance Discourage use of multiple inheritance Disallow interface inheritance { "no-interface": false }
OFF no-named-params Disallow named function parameters
OFF no-named-returns Discourage use of named returns in functions
OFF 256-bit-ints-only Disallow non-256 bit integers
OFF no-suicide-or-selfdestruct Disallow suicide and selfdestruct
OFF no-var Disallow type deduction via var
OFF no-user-defined-modifiers Disallow user-defined modifiers
OFF no-void-returns Discourage use of void returns in functions prototypes
OFF no-func-overriding Discourage function overriding

An example soliumrc.json configuring and applying this plugin is:

{
    "plugins": ["security"],
    "rules": {
        "some-other-solium-rule": 1,
        "security/no-low-level-calls": ["error", ["call", "delegatecall"]],
        "security/no-block-members": [1, ["timestamp"]],
        "security/no-throw": "off"
    }
}

This tells solium to apply the 3 security/ rules with special configuration provided and apply the remaining rules of the plugin with their default configurations. If you want to disable a plugin rule, you have to explicitly disable it inside rules.

Lint normally using solium -d contracts/ or solium -d contracts/ --fix to apply fixes as well.

Developer Setup

  • git clone <URL-of-this-repo>
  • cd solium-plugin-security
  • npm install --dev
  • npm link
  • npm link solium-plugin-security
  • npm test

If you'd also like to use your develop build of this plugin with dev build of Solium, go to Solium's directory and run npm link solium-plugin-security. This will let Solium access your modified plugin instead of its pre-installed security module.

Access Solium's Developer Docs

Roadmap

  • Add automated tests
  • Refine rule enforce-explicit-visibility
  • Add more security rules

Security rules to be implemented

  • no-multiple-send-calls
  • check-send-result

Access the complete Solium documentation

Package Sidebar

Install

npm i solium-plugin-security

Weekly Downloads

1,629

Version

0.1.1

License

MIT

Last publish

Collaborators

  • the-mad-king