flawopen.com/Teardowns/cve-2023-32558-nodejs-permission-model-fs-escape
vulnerabilidade का गहन तकनीकी स्रोत कोड विश्लेषण और सुरक्षा सुदृढ़ीकरण गाइड: भेद्यता के मूल कारण और सुरक्षित पैच की समीक्षा।
सरल भौतिक उपमा द्वारा समझें: Imagine a high-security office building with security guards at the front doors checking badges. A worker who doesn't have a badge walks around back, opens the maintenance door marked 'Internal Staff Only', and walks straight into the vault. In Node.js, the developer guarded the public JavaScript functions, but forgot to lock the underlying C++ internal door.
Node.js Permission Model--permission CLI flag restricting process capabilities like filesystem, child process, and worker access.process.binding()Path ContainmentDefense-in-Depthमूल कारण ओपन सोर्स सिस्टम में अनसत्यापित सीमा पैरामीटर हैं, जिससे स्थिति का असंतुलन और सुरक्षा नियंत्रणों को बायपास किया जा सकता है।
तकनीकी शोषण तंत्र और निष्पादन विवरण: A developer runs untrusted code with node --permission --allow-fs-read=/tmp app.js.
तकनीकी शोषण तंत्र और निष्पादन विवरण: The script invokes const binding = process.binding('fs');.
तकनीकी शोषण तंत्र और निष्पादन विवरण: The script calls binding.open('/etc/passwd') directly, bypassing fs.readFile() wrappers.
तकनीकी शोषण तंत्र और निष्पादन विवरण: The native C++ binding executes without permission checks, leaking confidential server files.
// VULNERABLE: src/node_file.cc before patch
static void Open(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
// ROOT CAUSE:
// Only verified permissions if called through JS 'fs' module wrappers!
// Direct callers of process.binding('fs').open() evaded the check!
const char* path = *Utf8Value(env->isolate(), args[0]);
int fd = uv_fs_open(..., path, ...);
args.GetReturnValue().Set(fd);
}
// SECURE: src/node_file.cc patch
static void Open(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
const char* path = *Utf8Value(env->isolate(), args[0]);
// 1. Enforce permission verification directly inside native C++ binding layer
if (env->permission()->is_enabled()) {
if (!env->permission()->is_granted(PermissionScope::kFileSystemRead, path)) {
THROW_ERR_ACCESS_DENIED(env, "Access to path %s denied by Permission Model", path);
return;
}
}
int fd = uv_fs_open(..., path, ...);
args.GetReturnValue().Set(fd);
}
process.binding() and internal Node.js modules from user-space code को अक्षम या प्रतिबंधित करें।