Ozgu Alay

55 papers A* 2A 3B 10Misc 3Journal 20Unranked 17
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Netw. Serv. Manag.
Sergi Alcalá-Marín, Weili Wu, Aravindh Raman, Marcelo Bagnulo, Ozgu Alay, Fabián E. Bustamante, Marco Fiore, Andra Lutu
2025 J jnl
CoRR
Paniz Parastar, Giuseppe Caso, Jesus Alberto Omaña Iglesias, Andra Lutu, Ozgu Alay
2025 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Bruno Yuji Lino Kimura, Simone Ferlin, Thomas William do Prado Paiva, Toktam Mahmoodi, Anna Brunström, Ozgu Alay
2025 J jnl
Comput. Commun.
Imran Khan, Moinak Ghoshal, Joana Angjo, Sigrid Dimce, Mushahid Hussain, Paniz Parastar, Yenchia Yu, Xueting Deng, Sumit Hawal, Shirui Huang, Ameya Rane, Yin Wang, Claudio Fiandrino, Charalampos Orfanidis, Shivang Aggarwal, Ana C. Aguiar, Ozgu Alay, Carla-Fabiana Chiasserini, Falko Dressler, Y. Charlie Hu, Steven Y. Ko, Dimitrios Koutsonikolas, Joerg Widmer
2025 J jnl
Internet Things
Pattiwar Shravan Kumar, Paresh Saxena, Ozgu Alay
2025 conf
NPC (1)
Pattiwar Shravan Kumar, Paresh Saxena, Ozgu Alay
2024 J jnl
IEEE Commun. Mag.
Konstantinos Kousias, Mohammad Rajiullah, Giuseppe Caso, Usman Ali, Ozgu Alay, Anna Brunström, Luca De Nardis, Marco Neri, Maria-Gabriella Di Benedetto
2024 J jnl
Comput. Networks
Konstantinos Kousias, Mohammad Rajiullah, Giuseppe Caso, Ozgu Alay, Anna Brunström, Usman Ali, Luca De Nardis, Marco Neri, Maria-Gabriella Di Benedetto
2024 B conf
IFIP Networking
Imran Khan, Moinak Ghoshal, Joana Angjo, Sigrid Dimce, Mushahid Hussain, Paniz Parastar, Yenchia Yu, Claudio Fiandrino, Charalampos Orfanidis, Shivang Aggarwal, Ana C. Aguiar, Ozgu Alay, Carla-Fabiana Chiasserini, Falko Dressler, Y. Charlie Hu, Steven Y. Ko, Dimitrios Koutsonikolas, Joerg Widmer
2024 J jnl
Comput. Networks
Paniz Parastar, Giuseppe Caso, Jesus Alberto Omaña Iglesias, Andra Lutu, Ozgu Alay
2024 J jnl
IEEE Open J. Commun. Soc.
Giuseppe Caso, Mohammad Rajiullah, Konstantinos Kousias, Usman Ali, Nadir Bouzar, Luca De Nardis, Anna Brunström, Ozgu Alay, Marco Neri, Maria-Gabriella Di Benedetto
2023 A conf
MMSys
Thomas William do Prado Paiva, Simone Ferlin, Anna Brunström, Ozgu Alay, Bruno Yuji Lino Kimura
2023 conf
TMA
Giuseppe Caso, Mohammad Rajiullah, Konstantinos Kousias, Usman Ali, Luca De Nardis, Anna Brunström, Ozgu Alay, Marco Neri, Maria-Gabriella Di Benedetto
2023 conf
5G-MeMZ@SIGCOMM
Mohammad Rajiullah, Giuseppe Caso, Anna Brunström, Jonas Karlsson, Stefan Alfredsson, Ozgu Alay
2023 conf
MMVE@MMSys
Emil Magnar Kjenstad, Halvor Kristian Ringsby, Rahel Jamal Gaeb, Çagri Erdem, Konstantinos Kousias, Ozgu Alay, Carsten Griwodz
2022 J jnl
CoRR
Hongjia Wu, Ozgu Alay, Anna Brunström, Giuseppe Caso, Simone Ferlin
2022 A conf
MobiSys
Sergi Alcalá-Marín, Aravindh Raman, Weili Wu, Andra Lutu, Marcelo Bagnulo, Ozgu Alay, Fabián E. Bustamante
2021 conf
5G-MeMZ@SIGCOMM
Georgios Xilouris, Maria Christopoulou, Harilaos Koumaras, Michail-Alexandros Kourtis, Marc Emmelmann, Dionysia Triantafyllopoulou, Yogaratnam Rahulan, Iván González Muriel, Almudena Díaz-Zayas, Eneko Atxutegi, Georgios Gardikis, Dimitris Lioprasitis, Dimitris Tsolkas, Panagiotis Kostakis, Erik Aumayr, Anne-Marie Bosneag, Ozgu Alay, Valerio Frascolla, Anna Brunström
2021 J jnl
IEEE Commun. Mag.
Celso Ferreira da Silva, Simone Ferlin, Ozgu Alay, Anna Brunström, Bruno Yuji Lino Kimura
2020 J jnl
IEEE Commun. Mag.
Konstantinos Kousias, Giuseppe Caso, Ozgu Alay, Anna Brunström, Luca De Nardis, Maria-Gabriella Di Benedetto, Marco Neri
2020 J jnl
CoRR
Konstantinos Kousias, Apostolos Pappas, Ozgu Alay, Antonios Argyriou, Michael Riegler
2019 A* conf
ACM Multimedia
Cise Midoglu, Anatoliy Zabrovskiy, Ozgu Alay, Daniel Hoelbling-Inzko, Carsten Griwodz, Christian Timmerer
2019 J jnl
IEEE/ACM Trans. Netw.
Per Hurtig, Karl-Johan Grinnemo, Anna Brunström, Simone Ferlin, Ozgu Alay, Nicolas Kuhn
2019 B conf
Networking
Pablo Garrido, Isabel Sanchez, Simone Ferlin, Ramón Agüero, Ozgu Alay
2019 B conf
GLOBECOM
Pablo Garrido, Isabel Sanchez, Simone Ferlin, Ramón Agüero, Ozgu Alay
2018 conf
CAMAD
Harilaos Koumaras, Dimitris Tsolkas, Georgios Gardikis, Pedro Merino Gómez, Valerio Frascolla, Dionysia Triantafyllopoulou, Marc Emmelmann, Vaios Koumaras, María L. García Osma, Daniele Munaretto, Eneko Atxutegi, Jara Suarez de Puga, Ozgu Alay, Anna Brunström, Anne-Marie Cristina Bosneag
2018 conf
RTSI
Ozgu Alay, Vincenzo Mancuso, Anna Brunström, Stefan Alfredsson, Marco Mellia, Giacomo Bernini, Håkon Lønsethagen
2018 conf
INFOCOM Workshops
Cise Midoglu, Leonhard Wimmer, Andra Lutu, Ozgu Alay, Carsten Griwodz
2018 J jnl
IEEE/ACM Trans. Netw.
Simone Ferlin, Stepán Kucera, Holger Claussen, Ozgu Alay
2018 J jnl
CoRR
Simone Ferlin, Stepán Kucera, Holger Claussen, Ozgu Alay
2018 J jnl
IEEE Commun. Mag.
Anna Maria Mandalari, Andra Lutu, Bob Briscoe, Marcelo Bagnulo, Ozgu Alay
2018 conf
TMA
Chad Jarvis, Cise Midoglu, Andra Lutu, Ozgu Alay
2017 J jnl
CoRR
Cise Midoglu, Leonhard Wimmer, Andra Lutu, Ozgu Alay, Carsten Griwodz
2017 conf
TMA
Anika Schwind, Michael Seufert, Ozgu Alay, Pedro Casas, Phuoc Tran-Gia, Florian Wamser
2017 conf
TMA
Iain R. Learmonth, Andra Lutu, Gorry Fairhurst, David Ros, Ozgu Alay
2017 A conf
ITC
Ali Safari Khatouni, Marco Mellia, Marco Ajmone Marsan, Stefan Alfredsson, Jonas Karlsson, Anna Brunström, Ozgu Alay, Andra Lutu, Cise Midoglu, Vincenzo Mancuso
2017 B conf
PIMRC
Konstantinos Kousias, Cise Midoglu, Ozgu Alay, Andra Lutu, Antonios Argyriou, Michael Riegler
2017 A* conf
INFOCOM
Mah-Rukh Fida, Andra Lutu, Mahesh K. Marina, Ozgu Alay
2016 B conf
WCNC
Ozgu Alay, Antonios Argyriou
2016 conf
ICC
Runa Barik, Michael Welzl, Simone Ferlin, Ozgu Alay
2014 conf
CSWS@SIGCOMM
Christoph Paasch, Simone Ferlin, Ozgu Alay, Olivier Bonaventure
2014 conf
AINA Workshops
Simone Ferlin Oliveira, Thomas Dreibholz, Ozgu Alay, Amund Kvalbein
2014 B conf
GLOBECOM
Simone Ferlin, Thomas Dreibholz, Ozgu Alay
2014 B conf
WCNC
Ozgu Alay, Antonios Argyriou
2012 conf
PV
Ozgu Alay, Helge Stephansen
2012 J jnl
CoRR
Xiaozhong Xu, Ozgu Alay, Elza Erkip, Yao Wang, Shivendra S. Panwar
2011 J jnl
IEEE Trans. Multim.
Ozgu Alay, Pei Liu, Yao Wang, Elza Erkip, Shivendra S. Panwar
2010 B conf
PIMRC
Trung Quang Duong, Ozgu Alay, Elza Erkip, Hans-Jürgen Zepernick
2010 B conf
PIMRC
Ozgu Alay, Zhili Guo, Yao Wang, Elza Erkip, Shivendra S. Panwar
2010 Misc conf
ICASSP
Ozgu Alay, Pei Liu, Yao Wang, Elza Erkip, Shivendra S. Panwar
2009 conf
CCNC
Ozgu Alay, Thanasis Korakis, Yao Wang, Shivendra S. Panwar
2009 conf
CCNC
Ozgu Alay, Thanasis Korakis, Yao Wang, Shivendra S. Panwar
2009 Misc conf
CISS
Ozgu Alay, Xin Pan, Elza Erkip, Yao Wang
2008 B conf
ICIP
Ozgu Alay, Thanasis Korakis, Yao Wang, Shivendra S. Panwar
2008 Misc conf
ICASSP
Ozgu Alay, Thanasis Korakis, Yao Wang, Elza Erkip, Shivendra S. Panwar
redb/extractors/js_extractors/js_patterns.py
← Index redb/extractors/js_extractors/js_patterns.py python
"""Canonical, compiled JavaScript regex patterns shared across JS extractors.

All suspicious-API patterns and the few feature-only patterns live here so each
expression is compiled exactly once per Python process and so any pattern that
was previously duplicated across `js_features.py` and `js_suspicious_apis.py`
now resolves to a single shared compiled object.

JavaScript is case-sensitive at runtime, but every suspicious-API pattern matches
either a literal-case identifier (`\\beval\\s*\\(`, `String\\.fromCharCode`, etc.)
or a string-quoted token (`"powershell"`). Compiling them with `re.IGNORECASE`
matches the historical behaviour of `JSSuspiciousAPIsExtractor` and is safe for
the patterns that historically came from `JSFeaturesExtractor` — those literals
are spelled in real-world JS exactly as written.

`scan_source()` is the entry point used by extractors: it walks the source once
per pattern using the pre-compiled regexes and returns a flat
`{name: {"count": N, "lines": [unique_line_numbers_sorted]}}` dict. Both
`JSFeaturesExtractor` and `JSSuspiciousAPIsExtractor` consume the same dict so
the per-pattern × per-line loops they used to run independently collapse to a
single shared scan.
"""

import bisect
import re
from typing import Dict, Iterable, List, Mapping

_FLAGS = re.IGNORECASE

# Canonical compiled patterns, keyed by their human-readable name. The name is
# also the value emitted into `redb_js_suspicious_apis.api_name`.
PATTERNS = {
    # ---- code execution ----
    "eval": re.compile(r"\beval\s*\(", _FLAGS),
    "Function constructor": re.compile(r"\bnew\s+Function\s*\(", _FLAGS),
    "execScript": re.compile(r"\bexecScript\s*\(", _FLAGS),
    "document.write": re.compile(r"\bdocument\.write(?:ln)?\s*\(", _FLAGS),
    "innerHTML assignment": re.compile(r"\.innerHTML\s*=", _FLAGS),
    "outerHTML assignment": re.compile(r"\.outerHTML\s*=", _FLAGS),
    "insertAdjacentHTML": re.compile(r"\.insertAdjacentHTML\s*\(", _FLAGS),
    # ---- network ----
    "XMLHttpRequest": re.compile(r"\bnew\s+XMLHttpRequest\b", _FLAGS),
    "fetch": re.compile(r"\bfetch\s*\(", _FLAGS),
    "WebSocket": re.compile(r"\bnew\s+WebSocket\s*\(", _FLAGS),
    "navigator.sendBeacon": re.compile(r"\bnavigator\.sendBeacon\s*\(", _FLAGS),
    "ActiveXObject XMLHTTP": re.compile(
        r"ActiveXObject\s*\(\s*[\"\'](?:MSXML2\.XMLHTTP|Microsoft\.XMLHTTP)", _FLAGS
    ),
    "require network module": re.compile(
        r"require\s*\(\s*[\"\'](?:http|https|net|dgram)[\"\']", _FLAGS
    ),
    "axios": re.compile(r"\baxios\b", _FLAGS),
    # ---- filesystem ----
    "require fs": re.compile(r"require\s*\(\s*[\"\']fs[\"\']", _FLAGS),
    "require path": re.compile(r"require\s*\(\s*[\"\']path[\"\']", _FLAGS),
    "FileSystemObject": re.compile(r"Scripting\.FileSystemObject", _FLAGS),
    "ADODB.Stream": re.compile(r"ADODB\.Stream", _FLAGS),
    "Shell.Application": re.compile(r"Shell\.Application", _FLAGS),
    "WScript.CreateObject": re.compile(r"WScript\.CreateObject", _FLAGS),
    # ---- process ----
    "require child_process": re.compile(r"require\s*\(\s*[\"\']child_process[\"\']", _FLAGS),
    "child_process exec": re.compile(r"child_process\.(?:exec|spawn|execFile|fork)\s*\(", _FLAGS),
    "WScript.Shell": re.compile(r"WScript\.Shell", _FLAGS),
    "WScript.Shell.Run": re.compile(r"\.Run\s*\(", _FLAGS),
    "WScript.Shell.Exec": re.compile(r"\.Exec\s*\(", _FLAGS),
    "ShellExecute": re.compile(r"\bShellExecute\b", _FLAGS),
    "PowerShell reference": re.compile(r"[\"\']powershell[\"\']", _FLAGS),
    "cmd.exe reference": re.compile(r"[\"\']cmd\.exe[\"\']", _FLAGS),
    "require os": re.compile(r"require\s*\(\s*[\"\']os[\"\']", _FLAGS),
    # ---- registry ----
    "RegRead": re.compile(r"\.RegRead\s*\(", _FLAGS),
    "RegWrite": re.compile(r"\.RegWrite\s*\(", _FLAGS),
    "RegDelete": re.compile(r"\.RegDelete\s*\(", _FLAGS),
    "StdRegProv": re.compile(r"StdRegProv", _FLAGS),
    # ---- crypto / encoding ----
    "atob": re.compile(r"\batob\s*\(", _FLAGS),
    "btoa": re.compile(r"\bbtoa\s*\(", _FLAGS),
    "String.fromCharCode": re.compile(r"String\.fromCharCode\s*\(", _FLAGS),
    "unescape": re.compile(r"\bunescape\s*\(", _FLAGS),
    "decodeURIComponent": re.compile(r"\bdecodeURIComponent\s*\(", _FLAGS),
    "Buffer.from": re.compile(r"Buffer\.from\s*\(", _FLAGS),
    "crypto module": re.compile(r"crypto\.create(?:Cipher|Decipher|Hash|Hmac)", _FLAGS),
    # ---- DOM manipulation ----
    "document.forms": re.compile(r"document\.forms", _FLAGS),
    "document.cookie": re.compile(r"document\.cookie", _FLAGS),
    "querySelector sensitive input": re.compile(
        r"document\.querySelector\s*\([^)]*(?:password|credit|card|cvv|ssn)", _FLAGS
    ),
    "submit event listener": re.compile(r"addEventListener\s*\(\s*[\"\']submit", _FLAGS),
    "createElement script/iframe": re.compile(
        r"\.createElement\s*\(\s*[\"\'](?:script|iframe)", _FLAGS
    ),
    "dynamic script src": re.compile(r"\.src\s*=\s*[\"\'](?:https?://|//)", _FLAGS),
}

# Pattern name -> category (one of code_execution / network / filesystem /
# process / registry / crypto_encoding / dom_manipulation).
CATEGORIES = {
    "eval": "code_execution",
    "Function constructor": "code_execution",
    "execScript": "code_execution",
    "document.write": "code_execution",
    "innerHTML assignment": "code_execution",
    "outerHTML assignment": "code_execution",
    "insertAdjacentHTML": "code_execution",
    "XMLHttpRequest": "network",
    "fetch": "network",
    "WebSocket": "network",
    "navigator.sendBeacon": "network",
    "ActiveXObject XMLHTTP": "network",
    "require network module": "network",
    "axios": "network",
    "require fs": "filesystem",
    "require path": "filesystem",
    "FileSystemObject": "filesystem",
    "ADODB.Stream": "filesystem",
    "Shell.Application": "filesystem",
    "WScript.CreateObject": "filesystem",
    "require child_process": "process",
    "child_process exec": "process",
    "WScript.Shell": "process",
    "WScript.Shell.Run": "process",
    "WScript.Shell.Exec": "process",
    "ShellExecute": "process",
    "PowerShell reference": "process",
    "cmd.exe reference": "process",
    "require os": "process",
    "RegRead": "registry",
    "RegWrite": "registry",
    "RegDelete": "registry",
    "StdRegProv": "registry",
    "atob": "crypto_encoding",
    "btoa": "crypto_encoding",
    "String.fromCharCode": "crypto_encoding",
    "unescape": "crypto_encoding",
    "decodeURIComponent": "crypto_encoding",
    "Buffer.from": "crypto_encoding",
    "crypto module": "crypto_encoding",
    "document.forms": "dom_manipulation",
    "document.cookie": "dom_manipulation",
    "querySelector sensitive input": "dom_manipulation",
    "submit event listener": "dom_manipulation",
    "createElement script/iframe": "dom_manipulation",
    "dynamic script src": "dom_manipulation",
}

# Patterns consumed only by JSFeaturesExtractor (no category, never surfaced as
# a suspicious-API row). Kept here so every JS regex is compiled in one place.
FEATURE_PATTERNS = {
    "hex_escape": re.compile(r"\\x[0-9a-fA-F]{2}"),
    "unicode_escape": re.compile(r"\\u[0-9a-fA-F]{4}"),
    "base64_string": re.compile(r"[A-Za-z0-9+/]{40,}={0,2}"),
    # decodeURI matches BOTH decodeURI and decodeURIComponent. The latter is also
    # a suspicious-API pattern in PATTERNS; this broader form is what the
    # `decodeuri_count` feature column has historically counted.
    "decodeURI": re.compile(r"\b(?:decodeURI|decodeURIComponent)\s*\(", _FLAGS),
    "settimeout_setinterval": re.compile(r"\b(?:setTimeout|setInterval)\s*\(", _FLAGS),
    "function_decl": re.compile(r"\bfunction\s+\w+\s*\(|\bfunction\s*\("),
    "var_decl": re.compile(r"\b(?:var|let|const)\s+"),
    "string_concat": re.compile(r"[\"\'][\s]*\+[\s]*[\"\']"),
    "comment": re.compile(r"//.*?$|/\*[\s\S]*?\*/", re.MULTILINE),
    "long_string": re.compile(r"[\"\']([^\"\']{256,})[\"\']"),
    "array_function_call": re.compile(r"\[(?:0x[0-9a-f]+|[\d]+)\]\s*\(", _FLAGS),
}

# Patterns consumed only by JSStringsExtractor for encoded-string discovery.
# Scoped to *hidden* strings only — patterns whose decoded form is not visible
# to a substring search over the raw text. Plain long literals are not
# extracted here because they're already preserved in code_text_content and
# scraped by the IOC pipeline over text_raw / text_normalized.
#
# Distinct from FEATURE_PATTERNS even where the names rhyme:
#   FEATURE_PATTERNS["hex_escape"] / ["unicode_escape"]   -> single escape
#   STRING_PATTERNS["hex_escape_seq"] / ["unicode_escape_seq"] -> 4+ / 3+ in a row
#   FEATURE_PATTERNS["base64_string"]                     -> bare base64 token
#   STRING_PATTERNS["base64_quoted"]                      -> base64 inside JS quotes
# These do not share match objects with the suspicious-API or feature scans, so
# they are not folded into JSContext.scan; the strings extractor walks them
# itself (one finditer per pattern, with shared line-offset bisect in #4b).
STRING_PATTERNS = {
    "hex_escape_seq": re.compile(r"(?:\\x[0-9a-fA-F]{2}){4,}"),
    "unicode_escape_seq": re.compile(r"(?:\\u[0-9a-fA-F]{4}){3,}"),
    "charcode_call": re.compile(r"String\.fromCharCode\s*\(\s*([\d,\s]+)\s*\)"),
    "base64_quoted": re.compile(r"[\"\']([A-Za-z0-9+/]{40,}={0,2})[\"\']"),
    "concat_chain": re.compile(r"(?:[\"\'][^\"\']+[\"\']\s*\+\s*){3,}[\"\'][^\"\']+[\"\']"),
}


def line_offsets(source: str) -> List[int]:
    """Sorted list of byte offsets for every newline in `source`, plus a final
    sentinel of len(source). Used to translate match offsets into 1-indexed
    line numbers via bisect.
    """
    offsets = [-1]  # so that bisect_right of offset 0 returns line 1
    push = offsets.append
    idx = source.find("\n")
    while idx != -1:
        push(idx)
        idx = source.find("\n", idx + 1)
    return offsets


def _scan_one(
    pattern: "re.Pattern[str]", source: str, offsets: List[int]
) -> Dict[str, object]:
    """Run a single compiled pattern over `source` and return count + unique lines."""
    count = 0
    seen_lines: "set[int]" = set()
    for m in pattern.finditer(source):
        count += 1
        seen_lines.add(bisect.bisect_right(offsets, m.start()))
    if not count:
        return None  # type: ignore[return-value]
    return {"count": count, "lines": sorted(seen_lines)}


def scan_source(
    source: str,
    patterns: Iterable[Mapping[str, "re.Pattern[str]"]] = (PATTERNS, FEATURE_PATTERNS),
) -> Dict[str, Dict[str, object]]:
    """Scan `source` against every compiled pattern in `patterns`.

    Returns a dict keyed by pattern name. Each entry has:
        "count": total number of matches in the source
        "lines": sorted list of unique 1-indexed line numbers where the pattern
                 matched (deduplicated — multiple matches on the same line
                 collapse to one entry, preserving the historical
                 line-set semantics of JSSuspiciousAPIsExtractor)
    Patterns with zero matches are absent from the dict; callers should default
    to {"count": 0, "lines": []}.
    """
    if not source:
        return {}
    offsets = line_offsets(source)
    results: Dict[str, Dict[str, object]] = {}
    for table in patterns:
        for name, pat in table.items():
            entry = _scan_one(pat, source, offsets)
            if entry is not None:
                results[name] = entry
    return results