-
Notifications
You must be signed in to change notification settings - Fork 30.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
src: add security warning when inspector is running on public network #23756
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,67 @@ | ||||||||||||||||||||||||||||
'use strict'; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const dns = require('dns'); | ||||||||||||||||||||||||||||
const util = require('util'); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const lookup = util.promisify(dns.lookup); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const IP_RANGES = { | ||||||||||||||||||||||||||||
local: 'LOCAL', | ||||||||||||||||||||||||||||
private: 'PRIVATE', | ||||||||||||||||||||||||||||
public: 'PUBLIC' | ||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
function isValidIpV4(parts) { | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We already have this kind of functionality in core, it would be better to just reuse that. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do you mind pointing out where it is? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @slonka I believe you can find this kind of validation on internal/net.js Lines 25 to 37 in 2f1c356
|
||||||||||||||||||||||||||||
return parts.length === 4 && | ||||||||||||||||||||||||||||
(parts.every((part) => part >= 0 && part <= 255)); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
function convertPartsToLong(parts) { | ||||||||||||||||||||||||||||
return parts[0] * 1e9 + parts[1] * 1e6 + parts[2] * 1e3 + parts[3]; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// Loopback: 127.0.0.0 - 127.255.255.255. | ||||||||||||||||||||||||||||
// Private: 10.0.0.0 - 10.255.255.255, 172.16.0.0 - 172.31.255.255 | ||||||||||||||||||||||||||||
// 192.168.0.0 - 192.168.255.255 | ||||||||||||||||||||||||||||
// Public: everything else | ||||||||||||||||||||||||||||
function toRange(ip) { | ||||||||||||||||||||||||||||
if (ip >= 127000000000 && ip <= 127255255255) { | ||||||||||||||||||||||||||||
return IP_RANGES.local; | ||||||||||||||||||||||||||||
} else if ((ip >= 10000000000 && ip <= 10255255255) || | ||||||||||||||||||||||||||||
(ip >= 172016000000 && ip <= 172031255255) || | ||||||||||||||||||||||||||||
(ip >= 192168000000 && ip <= 192168255255)) { | ||||||||||||||||||||||||||||
return IP_RANGES.private; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
return IP_RANGES.public; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
async function checkInspectorHost(host) { | ||||||||||||||||||||||||||||
let parts = host.split('.').map((part) => parseInt(part, 10)); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (!isValidIpV4(parts)) { | ||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||
parts = await lookup(host); | ||||||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||||||
return `Inspector: could not determinate the ip of ${host}`; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
return ''; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const ip = convertPartsToLong(parts); | ||||||||||||||||||||||||||||
const range = toRange(ip); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (range === IP_RANGES.local) { | ||||||||||||||||||||||||||||
return ''; | ||||||||||||||||||||||||||||
} else if (range === IP_RANGES.private) { | ||||||||||||||||||||||||||||
return 'Inspector: you are running inspector on a private network. ' + | ||||||||||||||||||||||||||||
'Make sure you trust all the hosts on this network ' + | ||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This warning does not describe the actual implications and doesn't tell the user what the actual problem is. How about
Subnet could be taken from |
||||||||||||||||||||||||||||
'or filter out traffic on your firewall'; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
return 'Inspector: you are running inspector on a PUBLIC network. ' + | ||||||||||||||||||||||||||||
'This is a high security risk, anyone who has access to your computer ' + | ||||||||||||||||||||||||||||
'can run arbitrary code on your machine.'; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
module.exports = { checkInspectorHost }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about other loopback addresses? What about IPv6?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is just a guard against default value that is here, even when the user does not run node with inspect parameter