Om Thakkar

44 papers A* 9A 4C 1Misc 3Journal 26Unranked 1
YearRankTypeTitle / Venue / Authors
2025 C conf
ASRU
Virat Shejwalkar, Om Thakkar, Steve Chien, Nicole Rafidi, Arun Narayanan
2025 J jnl
Proc. Priv. Enhancing Technol.
Virat Shejwalkar, Arun Ganesh, Rajiv Mathews, Yarong Mu, Shuang Song, Om Thakkar, Abhradeep Thakurta, Xinyi Zheng
2024 J jnl
CoRR
Hongbin Liu, Lun Wang, Om Thakkar, Abhradeep Thakurta, Arun Narayanan
2024 A conf
INTERSPEECH
Lun Wang, Om Thakkar, Zhong Meng, Nicole Rafidi, Rohit Prabhavalkar, Arun Narayanan
2024 J jnl
CoRR
Lun Wang, Om Thakkar, Zhong Meng, Nicole Rafidi, Rohit Prabhavalkar, Arun Narayanan
2024 Misc conf
ICASSP
Matthew Jagielski, Om Thakkar, Lun Wang
2024 J jnl
CoRR
Matthew Jagielski, Om Thakkar, Lun Wang
2024 A conf
INTERSPEECH
Virat Shejwalkar, Om Thakkar, Arun Narayanan
2024 conf
SLT
Geeticka Chauhan, Steve Chien, Om Thakkar, Abhradeep Thakurta, Arun Narayanan
2024 J jnl
CoRR
Geeticka Chauhan, Steve Chien, Om Thakkar, Abhradeep Thakurta, Arun Narayanan
2024 Misc conf
ICASSP
Lun Wang, Om Thakkar, Rajiv Mathews
2023 A* conf
ICLR
Matthew Jagielski, Om Thakkar, Florian Tramèr, Daphne Ippolito, Katherine Lee, Nicholas Carlini, Eric Wallace, Shuang Song, Abhradeep Guha Thakurta, Nicolas Papernot, Chiyuan Zhang
2023 J jnl
CoRR
Lun Wang, Om Thakkar, Rajiv Mathews
2023 A* conf
ICML
Arun Ganesh, Mahdi Haghifam, Milad Nasr, Sewoong Oh, Thomas Steinke, Om Thakkar, Abhradeep Guha Thakurta, Lun Wang
2023 J jnl
CoRR
Arun Ganesh, Mahdi Haghifam, Milad Nasr, Sewoong Oh, Thomas Steinke, Om Thakkar, Abhradeep Thakurta, Lun Wang
2022 Misc conf
ICASSP
Trung Dang, Om Thakkar, Swaroop Ramaswamy, Rajiv Mathews, Peter Chin, Françoise Beaufays
2022 J jnl
CoRR
W. Ronny Huang, Steve Chien, Om Thakkar, Rajiv Mathews
2022 J jnl
CoRR
Ehsan Amid, Om Thakkar, Arun Narayanan, Rajiv Mathews, Françoise Beaufays
2022 J jnl
CoRR
Matthew Jagielski, Om Thakkar, Florian Tramèr, Daphne Ippolito, Katherine Lee, Nicholas Carlini, Eric Wallace, Shuang Song, Abhradeep Thakurta, Nicolas Papernot, Chiyuan Zhang
2022 A* conf
ICML
Ehsan Amid, Arun Ganesh, Rajiv Mathews, Swaroop Ramaswamy, Shuang Song, Thomas Steinke, Vinith M. Suriyakumar, Om Thakkar, Abhradeep Thakurta
2022 J jnl
CoRR
Virat Shejwalkar, Arun Ganesh, Rajiv Mathews, Om Thakkar, Abhradeep Thakurta
2022 A* conf
AAAI
Shubhankar Mohapatra, Sajin Sasy, Xi He, Gautam Kamath, Om Thakkar
2021 J jnl
CoRR
Trung Dang, Om Thakkar, Swaroop Ramaswamy, Rajiv Mathews, Peter Chin, Françoise Beaufays
2021 A* conf
NeurIPS
Galen Andrew, Om Thakkar, Brendan McMahan, Swaroop Ramaswamy
2021 A conf
AISTATS
Shuang Song, Thomas Steinke, Om Thakkar, Abhradeep Thakurta
2021 A* conf
ICML
Peter Kairouz, Brendan McMahan, Shuang Song, Om Thakkar, Abhradeep Thakurta, Zheng Xu
2021 J jnl
CoRR
Peter Kairouz, Brendan McMahan, Shuang Song, Om Thakkar, Abhradeep Thakurta, Zheng Xu
2021 J jnl
CoRR
Ehsan Amid, Arun Ganesh, Rajiv Mathews, Swaroop Ramaswamy, Shuang Song, Thomas Steinke, Vinith M. Suriyakumar, Om Thakkar, Abhradeep Thakurta
2021 A* conf
NeurIPS
Trung Dang, Om Thakkar, Swaroop Ramaswamy, Rajiv Mathews, Peter Chin, Françoise Beaufays
2021 J jnl
CoRR
Trung Dang, Om Thakkar, Swaroop Ramaswamy, Rajiv Mathews, Peter Chin, Françoise Beaufays
2021 J jnl
CoRR
Shubhankar Mohapatra, Sajin Sasy, Xi He, Gautam Kamath, Om Thakkar
2020 J jnl
CoRR
Shuang Song, Om Thakkar, Abhradeep Thakurta
2020 A conf
AISTATS
Ryan Rogers, Aaron Roth, Adam D. Smith, Nathan Srebro, Om Thakkar, Blake E. Woodworth
2020 J jnl
CoRR
Borja Balle, Peter Kairouz, H. Brendan McMahan, Om Thakkar, Abhradeep Thakurta
2020 J jnl
CoRR
Swaroop Ramaswamy, Om Thakkar, Rajiv Mathews, Galen Andrew, H. Brendan McMahan, Françoise Beaufays
2020 J jnl
CoRR
Om Thakkar, Swaroop Ramaswamy, Rajiv Mathews, Françoise Beaufays
2019 J jnl
CoRR
Om Thakkar, Galen Andrew, H. Brendan McMahan
2019 J jnl
CoRR
Ryan Rogers, Aaron Roth, Adam D. Smith, Nathan Srebro, Om Thakkar, Blake E. Woodworth
2019 A* conf
IEEE Symposium on Security and Privacy
Roger Iyengar, Joseph P. Near, Dawn Song, Om Thakkar, Abhradeep Thakurta, Lun Wang
2018 J jnl
CoRR
Raef Bassily, Om Thakkar, Abhradeep Thakurta
2017 J jnl
CoRR
Prateek Jain, Om Thakkar, Abhradeep Thakurta
2016 J jnl
CoRR
Ryan M. Rogers, Aaron Roth, Adam D. Smith, Om Thakkar
2016 A* conf
FOCS
Ryan M. Rogers, Aaron Roth, Adam D. Smith, Om Thakkar
2015 J jnl
CoRR
Punit Mehta, Rahul Muthu, Gaurav Patel, Om Thakkar, Devanshi Vyas
redb/extractors/js_extractors/scripts/js-xray-runner.js
← Index redb/extractors/js_extractors/scripts/js-xray-runner.js javascript
#!/usr/bin/env node
// Bridge between the Python JS pipeline and @nodesecure/js-x-ray.
//
// Usage: node js-xray-runner.js <path-to-js-file>
//   stdout  one JSON object: {"obfuscator": <name|null>, "warnings": [...]}
//   stderr  human-readable error on failure
//   exit 0  analysis ran (the file may still be benign — see "obfuscator")
//   exit 1  the file could not be read or analysed
//
// Each warning is emitted as {kind, value} so the Python side can tag
// supporting signals (encoded-literal, short-identifiers, suspicious-literal,
// unsafe-stmt) without having to mirror js-x-ray's whole schema.
//
// js-x-ray ≥7 ships as an ES module, which CommonJS `require()` cannot load
// from a `.js` script — the dynamic `import()` below is what makes the
// bridge work without renaming the file to `.mjs` or adding `"type":
// "module"` to package.json (which would break tools that still
// `require()` from this directory).

const fs = require("fs");
const path = require("path");

function fail(msg) {
  process.stderr.write(msg + "\n");
  process.exit(1);
}

async function main() {
  const target = process.argv[2];
  if (!target) fail("usage: js-xray-runner.js <file>");

  let source;
  try {
    source = fs.readFileSync(target, "utf8");
  } catch (e) {
    fail(`read failed: ${e.message}`);
  }

  // The legacy `runASTAnalysis` function is deprecated (removed in v8); the
  // current API is the `AstAnalyser` class. Both produce a result with the
  // same `warnings` shape, so the rest of the bridge is unchanged.
  let AstAnalyser;
  try {
    ({ AstAnalyser } = await import("@nodesecure/js-x-ray"));
  } catch (e) {
    fail(`@nodesecure/js-x-ray not installed (run \`npm install\` in ${path.dirname(__filename)}): ${e.message}`);
  }

  // js-x-ray defaults to module-mode parsing, which rejects scripts that
  // (legally) use reserved words as identifiers, top-level `return`, etc.
  // A lot of real-world JS malware is script-style (WScript/HTA bodies,
  // pasted snippets) — retrying in script mode catches those without
  // pulling in a more lenient parser. Both attempts share the same
  // analyser; only the parse mode flips. If both fail, the original error
  // (module-mode) is reported because that's the more informative one for
  // genuinely broken sources.
  let result;
  const analyser = new AstAnalyser();
  let firstErr;
  try {
    result = await analyser.analyse(source, { module: true });
  } catch (e) {
    firstErr = e;
    try {
      result = await analyser.analyse(source, { module: false });
    } catch (e2) {
      fail(`js-x-ray analysis failed: ${firstErr.message}`);
    }
  }

  const warnings = (result.warnings || []).map((w) => ({
    kind: w.kind,
    value: w.value !== undefined ? w.value : null,
  }));

  // js-x-ray flags the obfuscator family in a warning whose kind is
  // "obfuscated-code" and whose value names the family (jsfuck, obfuscator.io,
  // freejsobfuscator, morse, jjencode, ...). Absent => not detected.
  const obfWarning = warnings.find((w) => w.kind === "obfuscated-code");
  const obfuscator = obfWarning ? obfWarning.value : null;

  // js-x-ray runs its own AST internally with a modern parser, so its
  // identifier-length average is the only path the Python pipeline has to
  // that signal on ES2015+ sources — pyjsparser is ES5.1-only and silently
  // drops to 0 the moment it hits destructuring, classes, optional chaining,
  // etc. Surfacing this lets the heuristic's `avg_identifier_length<2`
  // strong signal fire on real obfuscator.io output. `null` when the value
  // is missing or non-numeric (defensive — older js-x-ray builds may differ).
  const idsLengthAvg =
    typeof result.idsLengthAvg === "number" && !Number.isNaN(result.idsLengthAvg)
      ? result.idsLengthAvg
      : null;

  process.stdout.write(JSON.stringify({ obfuscator, warnings, idsLengthAvg }));
}

main().catch((e) => fail(e.message || String(e)));