Ofer Arieli

117 papers A* 17A 6B 14C 11Misc 4Journal 46Unranked 17
YearRankTypeTitle / Venue / Authors
2025 J jnl
Theory Pract. Log. Program.
Jesse Heyninck, Ofer Arieli
2025 A* conf
KR
Ofer Arieli, Christian Straßer
2025 J jnl
Int. J. Approx. Reason.
Ofer Arieli, Jesse Heyninck
2024 Misc conf
SAC
Ofer Arieli, Jesse Heyninck
2024 A* conf
AAAI
Ofer Arieli, Kees van Berkel, Christian Straßer
2024 A* conf
KR
Ofer Arieli, Kees van Berkel, Badran Raddaoui, Christian Straßer
2024 J jnl
Artif. Intell.
Jesse Heyninck, Ofer Arieli, Bart Bogaerts
2024 A* conf
IJCAI
Jesse Heyninck, Ofer Arieli
2023 J jnl
Artif. Intell.
Ofer Arieli, Annemarie Borg, Christian Straßer
2023 J jnl
CoRR
Jesse Heyninck, Ofer Arieli
2023 A* conf
KR
Ofer Arieli, Jesse Heyninck
2022 conf
NMR
Ofer Arieli, Annemarie Borg, Matthis Hesse, Christian Straßer
2022 A* conf
IJCAI
Ofer Arieli, Kees van Berkel, Christian Straßer
2022 C conf
COMMA
Ofer Arieli, Annemarie Borg, Matthis Hesse, Christian Straßer
2022 J jnl
CoRR
Jesse Heyninck, Ofer Arieli, Bart Bogaerts
2022 ed.
NMR
Ofer Arieli, Giovanni Casini, Laura Giordano
2022 ed.
Description Logics
Ofer Arieli, Martin Homola, Jean Christoph Jung, Marie-Laure Mugnier
2021 J jnl
Stud Logica
Annemarie Borg, Christian Straßer, Ofer Arieli
2021 A* conf
KR
Jesse Heyninck, Ofer Arieli
2021 A* conf
KR
Ofer Arieli, Annemarie Borg, Christian Straßer
2021 J jnl
FLAP
Ofer Arieli, Annemarie Borg, Jesse Heyninck, Christian Straßer
2021 J jnl
Int. J. Approx. Reason.
Ofer Arieli, Jesse Heyninck
2020 C conf
COMMA
Jesse Heyninck, Ofer Arieli
2020 C conf
COMMA
Ofer Arieli, Christian Straßer
2020 A conf
ECAI
Ofer Arieli, Jesse Heyninck
2020 J jnl
Int. J. Approx. Reason.
Jesse Heyninck, Ofer Arieli
2020 Misc conf
FLAIRS
Ofer Arieli, Annemarie Borg, Christian Straßer
2019 J jnl
Ann. Math. Artif. Intell.
Ofer Arieli, Annemarie Borg, Jesse Heyninck
2019 conf
EPIA (2)
Jesse Heyninck, Ofer Arieli
2019 J jnl
Theor. Comput. Sci.
Ofer Arieli, Christian Straßer
2019 J jnl
J. Log. Comput.
Christian Straßer, Ofer Arieli
2019 J jnl
FLAP
Ofer Arieli, Anna Zamansky
2019 A conf
AAMAS
Jesse Heyninck, Ofer Arieli
2019 B conf
LPNMR
Jesse Heyninck, Ofer Arieli
2018 A conf
AAMAS
Annemarie Borg, Ofer Arieli
2018 C conf
COMMA
Jesse Heyninck, Ofer Arieli
2018 A conf
AAMAS
Ofer Arieli, Annemarie Borg, Christian Straßer
2018 J jnl
J. Log. Comput.
Ofer Arieli, Annemarie Borg, Christian Straßer
2017 conf
IEA/AIE (1)
Ofer Arieli, Annemarie Borg, Christian Straßer
2017 J jnl
Stud Logica
Ofer Arieli, Arnon Avron
2017 conf
TAFA
Annemarie Borg, Ofer Arieli, Christian Straßer
2016 J jnl
Fuzzy Sets Syst.
Ofer Arieli, Anna Zamansky
2016 A* conf
KR
Ofer Arieli, Christian Straßer
2016 J jnl
J. Log. Comput.
Ofer Arieli, Beata Konikowska, Alexander Rabinovich, Anna Zamansky
2016 B conf
FSCD
Ofer Arieli, Arnon Avron
2016 J jnl
J. Log. Comput.
Ofer Arieli
2016 J jnl
Log. J. IGPL
Ofer Arieli, Anna Zamansky
2015 J jnl
Ann. Math. Artif. Intell.
Ofer Arieli, Anna Zamansky
2015 J jnl
J. Appl. Log.
Ofer Arieli
2015 conf
LSFA
Ofer Arieli, Christian Straßer
2015 J jnl
Argument Comput.
Ofer Arieli, Christian Straßer
2014 conf
IPMU (2)
Anna Zamansky, Ofer Arieli, Kostas Stefanidis
2014 C conf
COMMA
Ofer Arieli, Christian Straßer
2014 C conf
COMMA
Ofer Arieli, Tjitze Rienstra
2014 conf
DEON
Christian Straßer, Ofer Arieli
2013 J jnl
J. Appl. Log.
Ofer Arieli, Martin W. A. Caminada
2013 conf
CLIMA
Ofer Arieli
2013 Misc conf
FLAIRS
Ofer Arieli
2012 C conf
COMMA
Ofer Arieli, Martin W. A. Caminada
2012 B conf
JELIA
Ofer Arieli
2012 conf
FoIKS
Ofer Arieli, Anna Zamansky
2011 J jnl
Int. J. Approx. Reason.
Ofer Arieli, Anna Zamansky
2011 J jnl
CoRR
Ofer Arieli, Maurice Bruynooghe, Marc Denecker, Bert Van Nuffelen
2011 J jnl
Stud Logica
Ofer Arieli, Arnon Avron, Anna Zamansky
2011 J jnl
Stud Logica
Ofer Arieli, Arnon Avron, Anna Zamansky
2011 J jnl
J. Appl. Log.
Ofer Arieli, Anna Zamansky
2011 A* conf
IJCAI
Ofer Arieli, Arnon Avron, Anna Zamansky
2010 A* conf
KR
Ofer Arieli, Arnon Avron, Anna Zamansky
2010 A* conf
LICS
Arnon Avron, Ofer Arieli, Anna Zamansky
2010 A* conf
KR
Ofer Arieli
2010 B conf
JELIA
Ofer Arieli, Anna Zamansky
2010 J jnl
ACM Trans. Database Syst.
Marc Denecker, Alvaro Cortés-Calabuig, Maurice Bruynooghe, Ofer Arieli
2009 J jnl
Log. J. IGPL
Ofer Arieli, Anna Zamansky
2009 C conf
ECSQARU
Ofer Arieli, Anna Zamansky
2008 A* conf
KR
Alvaro Cortés-Calabuig, Marc Denecker, Ofer Arieli, Maurice Bruynooghe
2008 conf
AGI
Ofer Arieli, Anna Zamansky
2008 J jnl
Int. J. Approx. Reason.
Ofer Arieli
2008 conf
AGI
Ofer Arieli
2008 C conf
WoLLIC
Ofer Arieli, Anna Zamansky
2008 J jnl
J. Appl. Log.
Ofer Arieli
2008 conf
Canadian AI
Ofer Arieli, Anna Zamansky
2007 J jnl
Int. J. Uncertain. Fuzziness Knowl. Based Syst.
Glad Deschrijver, Ofer Arieli, Chris Cornelis, Etienne E. Kerre
2007 A* conf
AAAI
Alvaro Cortés-Calabuig, Marc Denecker, Ofer Arieli, Maurice Bruynooghe
2007 B conf
TARK
Ofer Arieli
2007 J jnl
Ann. Math. Artif. Intell.
Ofer Arieli, Marc Denecker, Maurice Bruynooghe
2007 J jnl
ACM Trans. Comput. Log.
Ofer Arieli
2007 J jnl
IEEE Trans. Fuzzy Syst.
Chris Cornelis, Ofer Arieli, Glad Deschrijver, Etienne E. Kerre
2006 J jnl
Ann. Math. Artif. Intell.
Ofer Arieli, Marc Denecker, Bert Van Nuffelen, Maurice Bruynooghe
2006 B conf
JELIA
Ofer Arieli, Marc Denecker, Maurice Bruynooghe
2006 B conf
MDAI
Ofer Arieli, Chris Cornelis, Glad Deschrijver
2006 B conf
LPAR
Alvaro Cortés-Calabuig, Marc Denecker, Ofer Arieli, Maurice Bruynooghe
2005 B conf
LPNMR
Bert Van Nuffelen, Ofer Arieli, Alvaro Cortés-Calabuig, Maurice Bruynooghe
2005 C conf
ECSQARU
Ofer Arieli, Chris Cornelis, Glad Deschrijver, Etienne E. Kerre
2005 conf
BNAIC
Alvaro Cortés-Calabuig, Marc Denecker, Ofer Arieli, Bert Van Nuffelen, Maurice Bruynooghe
2005 B conf
LPNMR
Alvaro Cortés-Calabuig, Marc Denecker, Ofer Arieli, Bert Van Nuffelen, Maurice Bruynooghe
2004 J jnl
J. Artif. Intell. Res.
Ofer Arieli, Marc Denecker, Bert Van Nuffelen, Maurice Bruynooghe
2004 A conf
CAiSE
Bert Van Nuffelen, Alvaro Cortés-Calabuig, Marc Denecker, Ofer Arieli, Maurice Bruynooghe
2004 conf
FoIKS
Ofer Arieli, Marc Denecker, Bert Van Nuffelen, Maurice Bruynooghe
2004 A conf
ECAI
Ofer Arieli
2003 C conf
ECSQARU
Ofer Arieli
2003 J jnl
J. Appl. Non Class. Logics
Ofer Arieli
2003 J jnl
J. Log. Comput.
Ofer Arieli, Marc Denecker
2002 conf
FoIKS
Ofer Arieli, Marc Denecker
2002 J jnl
Ann. Math. Artif. Intell.
Ofer Arieli
2002 Misc conf
IC-AI
Ofer Arieli
2002 conf
Paraconsistent Computational Logic
Ofer Arieli, Marc Denecker, Bert Van Nuffelen, Maurice Bruynooghe
2001 B conf
LPAR
Ofer Arieli, Bert Van Nuffelen, Marc Denecker, Maurice Bruynooghe
2000 B conf
JELIA
Ofer Arieli
2000 J jnl
Log. J. IGPL
Ofer Arieli, Arnon Avron
1999 J jnl
J. Autom. Reason.
Ofer Arieli, Arnon Avron
1999 conf
ESCQARU
Ofer Arieli, Arnon Avron
1998 A* conf
LICS
Ofer Arieli, Arnon Avron
1998 J jnl
Artif. Intell.
Ofer Arieli, Arnon Avron
1996 B conf
ICTAI
Ofer Arieli, Arnon Avron
1996 B conf
CSL
Ofer Arieli, Arnon Avron
1996 J jnl
J. Log. Lang. Inf.
Ofer Arieli, Arnon Avron
1994 A* conf
LICS
Ofer Arieli, Arnon Avron
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()