Ioanna Papafili

29 papers A 1B 2Journal 6Unranked 19
YearRankTypeTitle / Venue / Authors
2017 conf
PCI
Alexandros Kostopoulos, Ioannis P. Chochliouros, Ioanna Papafili, Andreas Drakos
2017 J jnl
IEEE Commun. Mag.
Wolfgang John, Guido Marchetto, Felician Németh, Pontus Sköldström, Rebecca Steinert, Catalin Meirosu, Ioanna Papafili, Kostas Pentikousis
2017 J jnl
CoRR
Wolfgang John, Guido Marchetto, Felicián Németh, Pontus Sköldström, Rebecca Steinert, Catalin Meirosu, Ioanna Papafili, Kostas Pentikousis
2016 J jnl
CoRR
Guido Marchetto, Riccardo Sisto, Wolfgang John, Pontus Sköldström, Bertrand Pechenot, Felicián Németh, István Pelle, Juhoon Kim, Xuejun Cai, Chunyan Fu, Catalin Meirosu, Kostas Pentikousis, Sachin Sharma, Ioanna Papafili, Serena Spinoso, Matteo Virgilio, Rebecca Steinert, Per Kreuger, Shaoteng Liu, Jan Ekman, Antonio Manzalini, Apoorv Shukla
2016 conf
WONS
Alexandros Kostopoulos, Ioanna Papafili, Georgios Fortetsanakis, Maria Papadopouli
2015 conf
ICTON
Stefanos Dris, Michael Vanhoecke, Alessandro Aimone, Dimitrios Apostolopoulos, Ioannis Lazarou, Piet Demeester, Johan Bauwelinck, G. Goetz, Thorsten Wahlbrink, Roberto Magri, Ioanna Papafili, George Agapiou, Hercules Avramopoulos
2015 J jnl
CoRR
Wolfgang John, Catalin Meirosu, Pontus Sköldström, Felician Németh, András Gulyás, Mario Kind, Sachin Sharma, Ioanna Papafili, George Agapiou, Guido Marchetto, Riccardo Sisto, Rebecca Steinert, Per Kreuger, Henrik Abrahamsson, Antonio Manzalini, Nadi Sarrar
2015 J jnl
CoRR
Rebecca Steinert, Wolfgang John, Pontus Sköldström, Bertrand Pechenot, András Gulyás, István Pelle, Tamás Lévai, Felicián Németh, Juhoon Kim, Catalin Meirosu, Xuejun Cai, Chunyan Fu, Kostas Pentikousis, Sachin Sharma, Ioanna Papafili, Guido Marchetto, Riccardo Sisto, Fulvio Risso, Per Kreuger, Jan Ekman, Shaoteng Liu, Antonio Manzalini, Apoorv Shukla, Stefan Schmid
2015 B conf
IM
Juhoon Kim, Catalin Meirosu, Ioanna Papafili, Rebecca Steinert, Sachin Sharma, Fritz-Joachim Westphal, Mario Kind, Apoorv Shukla, Felician Németh, Antonio Manzalini
2015 conf
3PGCIC
Valentin Burger, George Darzanos, Ioanna Papafili, Michael Seufert
2014 A conf
ITC
George Darzanos, Ioanna Papafili, George D. Stamoulis
2014 conf
IMIS
Ioanna Papafili, Krzysztof Wajda, Roman Lapacz, Alessandro Predieri, Thomas Bocek, Michael Seufert
2014 conf
ASMS/SPSC
Claudio Cicconetti, Agostino Isca, George Agapiou, Ioanna Papafili, Erasmo Atteo, Maurizio Manzo, Dimitris Syvridis, Michael Bourmpos
2014 conf
MONAMI
Krzysztof Wajda, Rafal Stankiewicz, Zbigniew Duliñski, Tobias Hoßfeld, Michael Seufert, David Hausheer, Matthias Wichtlhuber, Ioanna Papafili, Manos Dramitinos, Paolo Cruschelli, Sergios Soursos, Roman Lapacz, Burkhard Stiller
2014 ch.
Socioinformatics
Michael Seufert, George Darzanos, Ioanna Papafili, Roman Lapacz, Valentin Burger, Tobias Hoßfeld
2014 conf
EMTC
George Agapiou, Ioanna Papafili, Stelios Agapiou
2013 conf
Future Network & Mobile Summit
Ioanna Papafili, Julius Rückert, Patrick Poullie, Sergios Soursos, Thomas Bocek, Krzysztof Wajda, David Hausheer, George D. Stamoulis, Burkhard Stiller
2013 conf
GI-Jahrestagung
Michael Seufert, George Darzanos, Valentin Burger, Ioanna Papafili, Tobias Hoßfeld
2013 B conf
CNSM
Manos Dramitinos, Nan Zhang, Miroslaw Kantor, José Costa-Requena, Ioanna Papafili
2012 conf
Future Internet Assembly
Alexandros Kostopoulos, Ioanna Papafili, Costas Kalogiros, Tapio Levä, Nan Zhang, Dirk Trossen
2012 conf
VALUETOOLS
Ioanna Papafili, Sergios Soursos, George D. Stamoulis
2012 conf
Future Internet Assembly
Dimitri Papadimitriou, Theodore B. Zahariadis, Pedro Martinez-Julia, Ioanna Papafili, Vito Morreale, Francesco Torelli, Bernard Sales, Piet Demeester
2011 conf
Future Internet Assembly
Ioanna Papafili, George D. Stamoulis, Rafal Stankiewicz, Simon Oechsner, Konstantin Pussep, Robert Wójcik, Jerzy Domzal, Dirk Staehle, Frank Lehrieder, Burkhard Stiller
2011 conf
IWSOS
Ioanna Papafili, George D. Stamoulis, Frank Lehrieder, Benjamin Kleine, Simon Oechsner
2011 J jnl
IEEE Commun. Mag.
György Dán, Tobias Hoßfeld, Simon Oechsner, Piotr Cholda, Rafal Stankiewicz, Ioanna Papafili, George D. Stamoulis
2010 conf
NGI
Ioanna Papafili, George D. Stamoulis
2009 conf
Future Internet Assembly
Tobias Hoßfeld, David Hausheer, Fabio Victora Hecht, Frank Lehrieder, Simon Oechsner, Ioanna Papafili, Péter Rácz, Sergios Soursos, Dirk Staehle, George D. Stamoulis, Phuoc Tran-Gia, Burkhard Stiller
2009 conf
ICQT
Ioanna Papafili, Sergios Soursos, George D. Stamoulis
2008 conf
IWSOS
Simon Oechsner, Sergios Soursos, Ioanna Papafili, Tobias Hoßfeld, George D. Stamoulis, Burkhard Stiller, María Ángeles Callejo-Rodríguez, Dirk Staehle
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()