diff options
author | Dan Finlay <flyswatter@users.noreply.github.com> | 2017-07-27 07:25:30 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-27 07:25:30 +0800 |
commit | e3b5bb2052d59afbf9c2761af883de719261062e (patch) | |
tree | cd68712a2429f9cbd1b78f3cd43744ae581a4cdb | |
parent | 520cda0058849778461cf6b9682980068149c120 (diff) | |
parent | aa282b4e3a55d090f27e37cacf850aa5298cfe27 (diff) | |
download | tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.tar tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.tar.gz tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.tar.bz2 tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.tar.lz tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.tar.xz tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.tar.zst tangerine-wallet-browser-e3b5bb2052d59afbf9c2761af883de719261062e.zip |
Merge pull request #1837 from MetaMask/i1833-levencheck
Levenshtein Checking Logic Added To Blacklist
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | app/scripts/blacklister.js | 44 | ||||
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | test/unit/blacklister-test.js | 24 |
4 files changed, 62 insertions, 8 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c5f727586..ab5d635d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Fix bugs that could sometimes result in failed transactions after switching networks. - Include stack traces in txMeta's to better understand the life cycle of transactions +- Enhance blacklister functionality to include levenshtein logic. (credit to @sogoiii and @409H for their help!) ## 3.9.1 2017-7-19 diff --git a/app/scripts/blacklister.js b/app/scripts/blacklister.js index a45265a75..9337599cc 100644 --- a/app/scripts/blacklister.js +++ b/app/scripts/blacklister.js @@ -1,13 +1,41 @@ -const blacklistedDomains = require('etheraddresslookup/blacklists/domains.json')
+const levenshtein = require('fast-levenshtein')
+const blacklistedMetaMaskDomains = ['metamask.com']
+const blacklistedDomains = require('etheraddresslookup/blacklists/domains.json').concat(blacklistedMetaMaskDomains)
+const whitelistedMetaMaskDomains = ['metamask.io', 'www.metamask.io']
+const whitelistedDomains = require('etheraddresslookup/whitelists/domains.json').concat(whitelistedMetaMaskDomains)
+const LEVENSHTEIN_TOLERANCE = 4
+const LEVENSHTEIN_CHECKS = ['myetherwallet', 'myetheroll', 'ledgerwallet', 'metamask']
-function detectBlacklistedDomain() {
- var strCurrentTab = window.location.hostname
- if (blacklistedDomains && blacklistedDomains.includes(strCurrentTab)) {
- window.location.href = 'https://metamask.io/phishing.html'
- }
+
+// credit to @sogoiii and @409H for their help!
+// Return a boolean on whether or not a phish is detected.
+function isPhish(hostname) {
+ var strCurrentTab = hostname
+
+ // check if the domain is part of the whitelist.
+ if (whitelistedDomains && whitelistedDomains.includes(strCurrentTab)) { return false }
+
+ // check if the domain is part of the blacklist.
+ var isBlacklisted = blacklistedDomains && blacklistedDomains.includes(strCurrentTab)
+
+ // check for similar values.
+ var levenshteinMatched = false
+ var levenshteinForm = strCurrentTab.replace(/\./g, '')
+ LEVENSHTEIN_CHECKS.forEach((element) => {
+ if (levenshtein.get(element, levenshteinForm) < LEVENSHTEIN_TOLERANCE) {
+ levenshteinMatched = true
+ }
+ })
+
+ return isBlacklisted || levenshteinMatched
}
-window.addEventListener('load', function() {
- detectBlacklistedDomain()
+window.addEventListener('load', function () {
+ var hostnameToCheck = window.location.hostname
+ if (isPhish(hostnameToCheck)) {
+ // redirect to our phishing warning page.
+ window.location.href = 'https://metamask.io/phishing.html'
+ }
})
+module.exports = isPhish
diff --git a/package.json b/package.json index dcd25cda6..10afc8228 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "express": "^4.14.0", "extension-link-enabler": "^1.0.0", "extensionizer": "^1.0.0", + "fast-levenshtein": "^2.0.6", "gulp-eslint": "^2.0.0", "hat": "0.0.3", "idb-global": "^1.0.0", diff --git a/test/unit/blacklister-test.js b/test/unit/blacklister-test.js new file mode 100644 index 000000000..d9290795c --- /dev/null +++ b/test/unit/blacklister-test.js @@ -0,0 +1,24 @@ +const assert = require('assert') +const Blacklister = require('../../app/scripts/blacklister') + + +describe('blacklister', function () { + describe('#isPhish', function () { + it('should not flag whitelisted values', function () { + var result = Blacklister('www.metamask.io') + assert(!result) + }) + it('should flag explicit values', function () { + var result = Blacklister('metamask.com') + assert(result) + }) + it('should flag levenshtein values', function () { + var result = Blacklister('metmask.io') + assert(result) + }) + it('should not flag not-even-close values', function () { + var result = Blacklister('example.com') + assert(!result) + }) + }) +}) |