Permissions scripting
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- javascript, node.js
- Lĩnh vực
- security
Hướng nghiên cứu
The issue does not name implementation files or tests. Start by reading Node.js's existing permission model and tracing how permission checks handle filesystem, child-process, and network access. The proposal needs design decisions about the script API, how it interacts with existing flags, and how checks are enforced; done means those behaviors are specified and covered by tests.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
What is the problem this feature will solve?
Right now, permissions are either all-or-nothing, or each path must be manually specified.
There is also a lack of scoping on most permission flags. While adding scoping to these flags would help significantly, it would be helpful to be able to write custom logic to scope them in a more fine-grained fashion.
This feature request is primarily motivated by the lack of scoping on child. Initially I had drafted a feature request to add simple allow-listed scoping for child, but if, for instance, the python executable were to be allow-listed, a malicious script could run:
function portable_rm(file) {
if (process.permission.has('fs.write', file) {
// unlink file using node apis
} else if (process.permission.has('child', 'rm') {
// exec rm file
} else if (process.permission.has('child', 'python') {
// exec python -c 'import shutil; shutil.rmtree(...)'
} // etc.
}
By using regex (or other custom logic), we can prevent these types of attacks by further limiting the command lines to known arguments.
What is the feature you are proposing to solve the problem?
A script that allows for custom scoping on all permission grants:
import path from 'node:path';
// Helper: path_str would already be an absolute path
function _check_path(path_str, allow_list) {
for (const allowed_path of allow_list) {
if (path.matchesGlob(path_str, path.resolve(allowed_path)))
return true;
}
return false;
}
function check_fs_read(path_str) {
return _check_path(path_str, [
'/foo/*',
'./bar/baz.txt'
]);
}
function check_fs_write(path_str) {
return _check_path(path_str, [
'./bar/baz.txt'
]);
}
function check_child(exec, args) {
if (exec === "python") {
if (args.length !== 2) return false;
return args[0] === "myproc.py";
} else if (exec === "esbuild") {
if (args.length < 1) return false;
return /^--(bundle|minify)$/.test(args[0]);
}
return false;
}
function check_net(addr) {
return /^https:\/\/([^/]*\.)?mycompany\.com\//.test(addr);
}
export default {
fs_read: check_fs_read,
fs_write: check_fs_write,
child: check_child,
net: check_net,
// any permission missing here would be denied by default, unless a respective --allow-* flag exists
}
It could then be run with (e.g.) node --permission --permissions-script=./permissions.js ...
The scoping does not necessarily have to be perfect, as just needs to match what the project knows it requires.
There would naturally be a minor performance hit, but this would allow for powerful scoping that would allow for projects to have permissions exactly as fine-grained as they needed.
On our end, the added security benefit far outweighs the performance hit, as it allows for better security during development. For deployment, we can replace the permission model with containers to remove the performance impact.
What alternatives have you considered?
-
Using a socket-based permission broker: https://docs.deno.com/runtime/fundamentals/security/#permission-broker
-
Adding regex-based allow-listing for
childandnet.
- Ngôn ngữ chính
- JavaScript
- Star
- 123k
- Fork
- 39.3k
- Merge trung bình
- 4 ngày 15 giờ
- Pull request đã merge (30 ngày)
- 238
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của nodejs/node
-
http2: content-encoding is incorrectly listed in kSingleValueHeadersCó thể đã có người làm @inoway46 đã nhận 2 ngày trước. Đang mởconfirmed-bug http2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
nodejs/node#67151 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
util.parseEnv and --env-file keep a leading UTF-8 BOM in the first keyCó thể đã có người làm @helmipradita đã nhận 4 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
node:internal/inspector/network_http: `TypeError: Missing dataLength` in event when response uses `setEncoding()`Có thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
nodejs/node#66551 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Docs] `process.loadEnvFile()` does not document behaviour when variables already existCó thể đã có người làm @Sepandard đã nhận 38 ngày trước. Đang mởdoc
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Stream.prototype.forEach will block in first promise in queue before read more chunkCó thể đã có người làm @mmustafasenoglu đã nhận 38 ngày trước. Đang mởdoc
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
Maintainer thường phản hồi trong vòng 1 ngày
Issue tương tự
-
bug confirmed js v6
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
BUG
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 90/100
linuxmint/cinnamon-spices-applets#9223 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
nopSolutions/nopCommerce#8440 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
follow-up
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Maintainer thường phản hồi trong vòng 1 ngày