Naga K. Govindaraju

67 papers A* 4A 8B 4C 3Misc 1Journal 13Unranked 33
YearRankTypeTitle / Venue / Authors
2021 A conf
EuroSys
Mark Russinovich, Naga K. Govindaraju, Melur Raghuraman, David Hepkin, Jamie Schwartz, Arun Kishan
2020 A* conf
OSDI
Sebastien Levy, Randolph Yao, Youjiang Wu, Yingnong Dang, Peng Huang, Zheng Mu, Pu Zhao, Tarun Ramani, Naga K. Govindaraju, Xukun Li, Qingwei Lin, Gil Lapid Shafriri, Murali Chintalapati
2014 ch.
Cloud Computing for Data-Intensive Applications
Baoxue Zhao, Jianlong Zhong, Bingsheng He, Qiong Luo, Wenbin Fang, Naga K. Govindaraju
2011 B conf
PPoPP
Yuri Dotsenko, Sara S. Baghsorkhi, Brandon Lloyd, Naga K. Govindaraju
2011 J jnl
IEEE Trans. Parallel Distributed Syst.
Wenbin Fang, Bingsheng He, Qiong Luo, Naga K. Govindaraju
2011 conf
SI3D
Brandon Lloyd, Nikunj Raghuvanshi, Naga K. Govindaraju
2010 conf
NPAR
Nelson Siu-Hang Chu, William Baxter, Li-Yi Wei, Naga K. Govindaraju
2010 J jnl
ACM Trans. Graph.
Nikunj Raghuvanshi, John M. Snyder, Ravish Mehra, Ming C. Lin, Naga K. Govindaraju
2010 conf
SIGGRAPH Talks
William Baxter, Nelson Siu-Hang Chu, Naga K. Govindaraju
2010 conf
SI3D
William Baxter, Naga K. Govindaraju
2009 J jnl
ACM Trans. Database Syst.
Bingsheng He, Mian Lu, Ke Yang, Rui Fang, Naga K. Govindaraju, Qiong Luo, Pedro V. Sander
2008 J jnl
Proc. IEEE
John L. Manferdelli, Naga K. Govindaraju, Chris Crall
2008 A conf
ICME
Brandon Lloyd, Chas Boyd, Naga K. Govindaraju
2008 A conf
ICS
Yuri Dotsenko, Naga K. Govindaraju, Peter-Pike J. Sloan, Charles Boyd, John Manferdelli
2008 A conf
SC
Naga K. Govindaraju, Brandon Lloyd, Yuri Dotsenko, Burton Smith, John Manferdelli
2008 J jnl
ACM Trans. Graph.
Brandon Lloyd, Naga K. Govindaraju, Cory Quammen, Steven E. Molnar, Dinesh Manocha
2008 B conf
PACT
Bingsheng He, Wenbin Fang, Qiong Luo, Naga K. Govindaraju, Tuyong Wang
2008 conf
SIGMOD Conference
Bingsheng He, Ke Yang, Rui Fang, Mian Lu, Naga K. Govindaraju, Qiong Luo, Pedro V. Sander
2007 J jnl
Parallel Comput.
Naga K. Govindaraju, Dinesh Manocha
2007 A conf
SC
Bingsheng He, Naga K. Govindaraju, Qiong Luo, Burton Smith
2007 J jnl
Comput. Graph.
Naga K. Govindaraju, Ilknur Kabul, Ming C. Lin, Dinesh Manocha
2007 conf
SIGMOD Conference
Rui Fang, Bingsheng He, Mian Lu, Ke Yang, Naga K. Govindaraju, Qiong Luo, Pedro V. Sander
2007 Misc conf
PG
Peter-Pike J. Sloan, Naga K. Govindaraju, Derek Nowrouzezahrai, John M. Snyder
2007 C conf
DaMoN
Ke Yang, Bingsheng He, Rui Fang, Mian Lu, Naga K. Govindaraju, Qiong Luo, Pedro V. Sander, Jiaoying Shi
2007 conf
SIGGRAPH Courses
Naga K. Govindaraju
2007 conf
Graphics Hardware
Brandon Lloyd, Naga K. Govindaraju, Steven E. Molnar, Dinesh Manocha
2007 conf
SIGGRAPH Courses
Naga K. Govindaraju
2007 B conf
Graphics Interface
Avneesh Sud, Naga K. Govindaraju, Russell Gayle, Erik Andersen, Dinesh Manocha
2006 J jnl
Presence Teleoperators Virtual Environ.
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2006 C conf
EGVE
Naga K. Govindaraju, Ilknur Kabul, Ming C. Lin, Dinesh Manocha
2006 J jnl
IEEE Trans. Vis. Comput. Graph.
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2006 J jnl
ACM Trans. Graph.
Avneesh Sud, Naga K. Govindaraju, Russell Gayle, Ilknur Kabul, Dinesh Manocha
2006 conf
SIGGRAPH Sketches
Avneesh Sud, Naga K. Govindaraju, Russell Gayle, Ilknur Kabul, Dinesh Manocha
2006 conf
SIGMOD Conference
Naga K. Govindaraju, Jim Gray, Ritesh Kumar, Dinesh Manocha
2006 conf
SI3D
Avneesh Sud, Naga K. Govindaraju, Russell Gayle, Dinesh Manocha
2006 A conf
SC
Naga K. Govindaraju, Scott Larsen, Jim Gray, Dinesh Manocha
2006 conf
SIGGRAPH Sketches
Brandon Lloyd, Naga K. Govindaraju, David Tuft, Steven E. Molnar, Dinesh Manocha
2006 A* conf
ICDE
Anastassia Ailamaki, Naga K. Govindaraju, Dinesh Manocha
2006 A* conf
VLDB
Anastassia Ailamaki, Naga K. Govindaraju, Stavros Harizopoulos, Dinesh Manocha
2006 A conf
SC
David P. Luebke, Mark J. Harris, Naga K. Govindaraju, Aaron E. Lefohn, Mike Houston, John D. Owens, Mark Segal, Matthew Papakipos, Ian Buck
2005 conf
Eurographics (State of the Art Reports)
John D. Owens, David Luebke, Naga K. Govindaraju, Mark J. Harris, Jens H. Krüger, Aaron E. Lefohn, Timothy J. Purcell
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju, Stephane Redon, Ming C. Lin, Dinesh Manocha
2005 conf
Eurographics (Tutorials)
Matthias Teschner, Bruno Heidelberger, Dinesh Manocha, Naga K. Govindaraju, Gabriel Zachmann, Stefan Kimmerle, Johannes Mezger, Arnulph Fuhrmann
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju
2005 C conf
DaMoN
Naga K. Govindaraju, Dinesh Manocha
2005 conf
SIGMOD Conference
Naga K. Govindaraju, Nikunj Raghuvanshi, Dinesh Manocha
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2005 conf
SCG
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju, Brandon Lloyd, Wei Wang, Ming C. Lin, Dinesh Manocha
2005 J jnl
ACM Trans. Graph.
Naga K. Govindaraju, David Knott, Nitin Jain, Ilknur Kabul, Rasmus Tamstorf, Russell Gayle, Ming C. Lin, Dinesh Manocha
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju
2005 conf
SI3D
Naga K. Govindaraju, Michael Henson, Ming C. Lin, Dinesh Manocha
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju, Michael Henson, Ming C. Lin, Dinesh Manocha
2005 A conf
SC
Nico Galoppo, Naga K. Govindaraju, Michael Henson, Dinesh Manocha
2005 J jnl
Comput. Animat. Virtual Worlds
Nitin Jain, Ilknur Kabul, Naga K. Govindaraju, Dinesh Manocha, Ming C. Lin
2005 A* conf
VR
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2005 conf
SIGGRAPH Courses
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2004 conf
Rendering Techniques
Brandon Lloyd, Jeremy Wend, Naga K. Govindaraju, Dinesh Manocha
2004 conf
SIGGRAPH Sketches
Brandon Lloyd, Jeremy Wendt, Naga K. Govindaraju, Dinesh Manocha
2004 conf
SIGMOD Conference
Naga K. Govindaraju, Brandon Lloyd, Wei Wang, Ming C. Lin, Dinesh Manocha
2004 conf
SIGGRAPH Sketches
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2004 B conf
VRST
Naga K. Govindaraju, Ming C. Lin, Dinesh Manocha
2004 conf
SIGGRAPH Course Notes
David Luebke, Mark J. Harris, Jens H. Krüger, Timothy J. Purcell, Naga K. Govindaraju, Ian Buck, Cliff Woolley, Aaron E. Lefohn
2003 conf
Graphics Hardware
Naga K. Govindaraju, Stephane Redon, Ming C. Lin, Dinesh Manocha
2003 J jnl
ACM Trans. Graph.
Naga K. Govindaraju, Brandon Lloyd, Sung-Eui Yoon, Avneesh Sud, Dinesh Manocha
2003 conf
SI3D
Naga K. Govindaraju, Avneesh Sud, Sung-Eui Yoon, Dinesh Manocha
2002 conf
Rendering Techniques
William V. Baxter III, Avneesh Sud, Naga K. Govindaraju, Dinesh Manocha
redb/extractors/js_extractors/js_xray.py
← Index redb/extractors/js_extractors/js_xray.py python
"""Subprocess wrapper for the bundled js-x-ray Node bridge.

Mirrors `js_deobfuscator.py`: shell out to a Node script with a per-sample
timeout, kill the process group on hang, demote `FileNotFoundError` to debug
(missing tool is routine — the host either has Node + the bundled package
installed or it doesn't), and return a structured result on success.

The bridge lives at `redb/extractors/js_extractors/scripts/js-xray-runner.js`.
Operators install the JS dependency once with `npm install` in that directory
(or override the path with `JS_XRAY_RUNNER_PATH`).

Configuration (env vars):
    JS_XRAY_RUNNER_PATH   Path to the Node bridge script (default: bundled).
    JS_XRAY_TIMEOUT       Seconds before the subprocess is killed. Default: 30.

`run(source, log)` returns `XRayResult(obfuscator, warnings)` on a successful
analysis, or `XRayResult(None, [])` for any non-success path (binary missing,
timeout, parse failure, etc.). The two unsuccessful states are
indistinguishable to the caller on purpose — they all collapse to "no
js-x-ray verdict, fall back to heuristic".
"""

from __future__ import annotations

import json
import os
import signal
import subprocess
import tempfile
from dataclasses import dataclass, field
from typing import List, Optional

# Bundled bridge: redb/extractors/js_extractors/scripts/js-xray-runner.js
_DEFAULT_RUNNER = os.path.join(
    os.path.dirname(__file__), "scripts", "js-xray-runner.js"
)
_DEFAULT_NODE = "node"
_DEFAULT_TIMEOUT_SECS = 30


@dataclass
class XRayResult:
    """Parsed js-x-ray output. `obfuscator` is the recognised family name
    (e.g. "jsfuck", "obfuscator.io") or None when js-x-ray did not flag the
    code. `warnings` carries every {kind, value} pair the analyser produced;
    the heuristic uses it as a corroborating signal. `avg_identifier_length`
    is js-x-ray's own AST-derived figure — used as a fallback for the
    heuristic's `avg_identifier_length<2` strong signal when pyjsparser
    can't parse the source (anything ES2015+ trips it)."""

    obfuscator: Optional[str] = None
    warnings: List[dict] = field(default_factory=list)
    avg_identifier_length: Optional[float] = None

    @property
    def flagged(self) -> bool:
        return self.obfuscator is not None


def _empty() -> XRayResult:
    return XRayResult(obfuscator=None, warnings=[])


def run(source: str, log) -> XRayResult:
    if not source:
        return _empty()

    runner = os.getenv("JS_XRAY_RUNNER_PATH", _DEFAULT_RUNNER)
    node_bin = os.getenv("JS_XRAY_NODE_BIN", _DEFAULT_NODE)
    timeout = int(os.getenv("JS_XRAY_TIMEOUT", str(_DEFAULT_TIMEOUT_SECS)))

    if not os.path.exists(runner):
        log.debug(f"js-x-ray runner not found at {runner}")
        return _empty()

    # Skip the subprocess entirely when the JS dependency isn't installed.
    # Without this, every call to a host that has `node` but never ran
    # `npm install` next to the runner would still fork node, get a require
    # error, and exit nonzero — wasted ~50–200ms per JS sample (and per test).
    runner_dir = os.path.dirname(runner)
    if not os.path.isdir(os.path.join(runner_dir, "node_modules", "@nodesecure", "js-x-ray")):
        log.debug(f"@nodesecure/js-x-ray not installed in {runner_dir}")
        return _empty()

    tmp_path = None
    try:
        with tempfile.NamedTemporaryFile(
            suffix=".js", mode="w", delete=False, encoding="utf-8"
        ) as tmp:
            tmp.write(source)
            tmp_path = tmp.name

        try:
            process = subprocess.Popen(
                [node_bin, runner, tmp_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                preexec_fn=os.setsid,
            )
            try:
                stdout, stderr = process.communicate(timeout=timeout)
            except subprocess.TimeoutExpired:
                # Kill the whole process group so any node helpers die too.
                try:
                    os.killpg(os.getpgid(process.pid), signal.SIGTERM)
                    process.wait(timeout=5)
                except Exception:
                    try:
                        os.killpg(os.getpgid(process.pid), signal.SIGKILL)
                    except Exception:
                        pass
                log.warning(f"js-x-ray timed out after {timeout}s")
                return _empty()

            if process.returncode != 0:
                err = stderr.decode("utf-8", errors="replace").strip()
                log.debug(f"js-x-ray exited {process.returncode}: {err}")
                return _empty()

            text = stdout.decode("utf-8", errors="replace").strip()
            if not text:
                return _empty()

            try:
                payload = json.loads(text)
            except json.JSONDecodeError as e:
                log.warning(f"js-x-ray emitted non-JSON output: {e}")
                return _empty()

            obfuscator = payload.get("obfuscator")
            warnings = payload.get("warnings") or []
            if not isinstance(warnings, list):
                warnings = []

            ids_avg = payload.get("idsLengthAvg")
            if not isinstance(ids_avg, (int, float)):
                ids_avg = None

            return XRayResult(
                obfuscator=obfuscator,
                warnings=warnings,
                avg_identifier_length=ids_avg,
            )
        finally:
            if tmp_path:
                try:
                    os.unlink(tmp_path)
                except Exception:
                    pass
    except FileNotFoundError:
        log.debug(f"node binary not found at {node_bin}")
        return _empty()
    except Exception as e:
        log.error(f"js-x-ray subprocess error: {e}")
        return _empty()