mirror of
https://github.com/elicpeter/nyx.git
synced 2026-06-12 19:55:14 +02:00
[pitboss/grind] deferred session-0017 (20260516T052512Z-20f8)
This commit is contained in:
parent
608929194d
commit
1062846a07
6 changed files with 366 additions and 186 deletions
|
|
@ -18,28 +18,18 @@ mod common;
|
|||
|
||||
#[cfg(feature = "dynamic")]
|
||||
mod javascript_fixture_tests {
|
||||
use crate::common::fixture_harness::run_shape_fixture_lang;
|
||||
use crate::common::fixture_harness::{run_shape_fixture_lang_or_skip, Prerequisite};
|
||||
use nyx_scanner::dynamic::spec::PayloadSlot;
|
||||
use nyx_scanner::evidence::{EntryKind, VerifyResult, VerifyStatus};
|
||||
use nyx_scanner::labels::Cap;
|
||||
use nyx_scanner::symbol::Lang;
|
||||
|
||||
fn node_available() -> bool {
|
||||
std::process::Command::new("node")
|
||||
.arg("--version")
|
||||
.output()
|
||||
.map(|o| o.status.success())
|
||||
.unwrap_or(false)
|
||||
}
|
||||
|
||||
fn node_module_available(name: &'static str) -> bool {
|
||||
std::process::Command::new("node")
|
||||
.arg("-e")
|
||||
.arg(format!("require.resolve('{name}')"))
|
||||
.output()
|
||||
.map(|o| o.status.success())
|
||||
.unwrap_or(false)
|
||||
}
|
||||
/// Base prereq slice shared by every JS shape: the host must have
|
||||
/// `node` on PATH. Framework-bound shapes extend the slice with a
|
||||
/// second `Prerequisite::NodeModuleAvailable("<pkg>")` entry so a
|
||||
/// host without the package on the resolution path skips with a
|
||||
/// structured reason rather than failing the test.
|
||||
const NODE_REQ: &[Prerequisite] = &[Prerequisite::CommandAvailable("node")];
|
||||
|
||||
fn assert_confirmed(shape: &str, result: &VerifyResult) {
|
||||
assert_eq!(
|
||||
|
|
@ -68,7 +58,9 @@ mod javascript_fixture_tests {
|
|||
);
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn run(
|
||||
requires: &[Prerequisite],
|
||||
shape: &str,
|
||||
file: &str,
|
||||
func: &str,
|
||||
|
|
@ -76,8 +68,9 @@ mod javascript_fixture_tests {
|
|||
sink_line: u32,
|
||||
kind: EntryKind,
|
||||
slot: PayloadSlot,
|
||||
) -> VerifyResult {
|
||||
run_shape_fixture_lang(
|
||||
) -> Option<VerifyResult> {
|
||||
run_shape_fixture_lang_or_skip(
|
||||
requires,
|
||||
Lang::JavaScript,
|
||||
"javascript",
|
||||
shape,
|
||||
|
|
@ -94,21 +87,21 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn commonjs_export_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
NODE_REQ,
|
||||
"commonjs_export", "vuln.js", "runPing", Cap::CODE_EXEC, 11,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("commonjs_export", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn commonjs_export_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
NODE_REQ,
|
||||
"commonjs_export", "benign.js", "runPing", Cap::CODE_EXEC, 11,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("commonjs_export", &r);
|
||||
}
|
||||
|
||||
|
|
@ -116,21 +109,21 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn async_function_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
NODE_REQ,
|
||||
"async_function", "vuln.js", "runPing", Cap::CODE_EXEC, 15,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("async_function", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn async_function_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
NODE_REQ,
|
||||
"async_function", "benign.js", "runPing", Cap::CODE_EXEC, 14,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("async_function", &r);
|
||||
}
|
||||
|
||||
|
|
@ -138,21 +131,21 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn esm_default_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
NODE_REQ,
|
||||
"esm_default", "vuln.js", "runPing", Cap::CODE_EXEC, 14,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("esm_default", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn esm_default_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
NODE_REQ,
|
||||
"esm_default", "benign.js", "runPing", Cap::CODE_EXEC, 14,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("esm_default", &r);
|
||||
}
|
||||
|
||||
|
|
@ -160,29 +153,27 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn express_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("express") {
|
||||
eprintln!("SKIP: express not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("express"),
|
||||
],
|
||||
"express", "vuln.js", "ping", Cap::CODE_EXEC, 15,
|
||||
EntryKind::HttpRoute, PayloadSlot::QueryParam("host".into()),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("express", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn express_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("express") {
|
||||
eprintln!("SKIP: express not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("express"),
|
||||
],
|
||||
"express", "benign.js", "ping", Cap::CODE_EXEC, 14,
|
||||
EntryKind::HttpRoute, PayloadSlot::QueryParam("host".into()),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("express", &r);
|
||||
}
|
||||
|
||||
|
|
@ -190,29 +181,27 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn koa_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("koa") {
|
||||
eprintln!("SKIP: koa not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("koa"),
|
||||
],
|
||||
"koa", "vuln.js", "ping", Cap::CODE_EXEC, 14,
|
||||
EntryKind::HttpRoute, PayloadSlot::QueryParam("host".into()),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("koa", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn koa_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("koa") {
|
||||
eprintln!("SKIP: koa not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("koa"),
|
||||
],
|
||||
"koa", "benign.js", "ping", Cap::CODE_EXEC, 14,
|
||||
EntryKind::HttpRoute, PayloadSlot::QueryParam("host".into()),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("koa", &r);
|
||||
}
|
||||
|
||||
|
|
@ -220,29 +209,27 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn next_route_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("next") {
|
||||
eprintln!("SKIP: next not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("next"),
|
||||
],
|
||||
"next_route", "vuln.js", "handler", Cap::CODE_EXEC, 17,
|
||||
EntryKind::HttpRoute, PayloadSlot::QueryParam("host".into()),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("next_route", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn next_route_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("next") {
|
||||
eprintln!("SKIP: next not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("next"),
|
||||
],
|
||||
"next_route", "benign.js", "handler", Cap::CODE_EXEC, 14,
|
||||
EntryKind::HttpRoute, PayloadSlot::QueryParam("host".into()),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("next_route", &r);
|
||||
}
|
||||
|
||||
|
|
@ -250,29 +237,27 @@ mod javascript_fixture_tests {
|
|||
|
||||
#[test]
|
||||
fn browser_event_vuln_is_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("jsdom") {
|
||||
eprintln!("SKIP: jsdom not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("jsdom"),
|
||||
],
|
||||
"browser_event", "vuln.js", "clickHandler", Cap::HTML_ESCAPE, 14,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_confirmed("browser_event", &r);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn browser_event_benign_not_confirmed() {
|
||||
if !node_available() { eprintln!("SKIP: node not available"); return; }
|
||||
if !node_module_available("jsdom") {
|
||||
eprintln!("SKIP: jsdom not importable");
|
||||
return;
|
||||
}
|
||||
let r = run(
|
||||
let Some(r) = run(
|
||||
&[
|
||||
Prerequisite::CommandAvailable("node"),
|
||||
Prerequisite::NodeModuleAvailable("jsdom"),
|
||||
],
|
||||
"browser_event", "benign.js", "clickHandler", Cap::HTML_ESCAPE, 14,
|
||||
EntryKind::Function, PayloadSlot::Param(0),
|
||||
);
|
||||
) else { return; };
|
||||
assert_not_confirmed("browser_event", &r);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue