Rafal Cupek

75 papers A* 1A 1B 13C 6Misc 2Journal 11Unranked 41
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Pi-Wei Chen, Jerry Chun-Wei Lin, Baris Fahri Kahriman, Zih-Ching Chen, Rafal Cupek, Marek Drewniak
2025 A conf
ECAI
Jerry Chun-Wei Lin, Pi-Wei Chen, Rafal Cupek
2025 conf
FedEdge-AI@MobiCom
Pi-Wei Chen, Naveen Sharma, Rafal Cupek, Marek Drewniak, Zih-Ching Chen, Jerry Chun-Wei Lin
2025 B conf
IEEE Big Data
Ireneusz Smolka, Olena Pavliuk, Rafal Cupek, Jakub Musial
2025 J jnl
Inf. Fusion
Jia-Hao Syu, Marcin Fojcik, Rafal Cupek, Jerry Chun-Wei Lin
2025 B conf
IEEE Big Data
Pi-Wei Chen, Myroslav Mishchuk, Alexandre Niyomugaba, Jerry Chun-Wei Lin, Rafal Cupek
2024 C conf
PDP
Karol Marszalek, Adam Domanski, Rafal Cupek, Jerry Chun-Wei Lin, Andrzej Kwiecien
2024 conf
SMARTINDUSTRY
Olena Pavliuk, Myroslav Mishchuk, Mykola Medykovskyy, Rafal Cupek
2024 conf
ACIIDS (Companion 1)
Tomasz Zyzak, Ireneusz Smolka, Piotr Gaj, Jacek Stój, Rafal Cupek
2024 B conf
IEEE Big Data
Pi-Wei Chen, Jerry Chun-Wei Lin, Rafal Cupek, Chao-Chun Chen
2024 Misc conf
CSIT
Olena Pavliuk, Mykola Medykovskyy, Rafal Cupek, Myroslav Mishchuk
2024 conf
ACIIDS (1)
Pi-Wei Chen, Jerry Chun-Wei Lin, Feng-Hao Yeh, Rafal Cupek, Chao-Chun Chen
2024 conf
PAKDD (5)
Jia-Hao Syu, Rafal Cupek, Chao-Chun Chen, Jerry Chun-Wei Lin
2023 Misc conf
CSIT
Mykola O. Medykovskyy, Rafal Cupek, Olena Pavliuk, Myroslav Mishchuk
2023 J jnl
Comput. Electr. Eng.
Jia-Hao Syu, Gautam Srivastava, Marcin Fojcik, Rafal Cupek, Jerry Chun-Wei Lin
2023 C conf
PDP
Jia-Hao Syu, Jerry Chun-Wei Lin, Marcin Fojcik, Rafal Cupek
2023 J jnl
CoRR
Jia-Hao Syu, Jerry Chun-Wei Lin, Marcin Fojcik, Rafal Cupek
2023 B conf
KES
Olav Sande, Marcin Fojcik, Marcin Hernes, Rafal Cupek, Marek Drewniak
2023 J jnl
Sensors
Jacek Stój, Anne-Lena Kampen, Rafal Cupek, Ireneusz Smolka, Marek Drewniak
2023 B conf
KES
Naveen Sharma, Rafal Cupek
2023 B conf
IEEE Big Data
Karol Marszalek, Adam Domanski, Rafal Cupek, Marek Drewniak
2023 B conf
DSAA
Jaroslaw Flak, Tomasz Skowron, Rafal Cupek, Marcin Fojcik, Dariusz Caban, Adam Domanski
2022 B conf
IEEE Big Data
Rafal Cupek, Jerry Chun-Wei Lin, Jia-Hao Syu
2022 J jnl
J. Comput. Sci.
Tomasz Steclik, Rafal Cupek, Marek Drewniak
2022 B conf
SMC
Anne-Lena Kampen, Rafal Cupek, Marcin Fojcik, Marek Drewniak, Knut Øvsthus
2022 conf
ICCCI (CCIS Volume)
Mühenad Bilal, Christian Mayer, Sunil Kancharana, Markus Bregulla, Rafal Cupek, Adam Ziebinski
2022 J jnl
Enterp. Inf. Syst.
Jacek Stój, Adam Ziebinski, Rafal Cupek
2022 conf
VISIGRAPP (5: VISAPP)
Mühenad Bilal, Sunil Kancharana, Christian Mayer, Daniel Pfaller, Leonid Koval, Markus Bregulla, Rafal Cupek, Adam Ziebinski
2022 B conf
IEEE Big Data
Katarzyna Filus, Lukasz Sobczak, Joanna Domanska, Adam Domanski, Rafal Cupek
2022 B conf
IEEE Big Data
Tomasz Steclik, Rafal Cupek, Marek Drewniak
2021 conf
ICCCI (CCIS Volume)
Leonid Koval, Daniel Pfaller, Mühenad Bilal, Markus Bregulla, Rafal Cupek
2021 conf
ICCS (4)
Adam Ziebinski, Dariusz Mrozek, Rafal Cupek, Damian Grzechca, Marcin Fojcik, Marek Drewniak, Erik Kyrkjebø, Jerry Chun-Wei Lin, Knut Øvsthus, Piotr Biernacki
2021 conf
ICCS (4)
Rafal Cupek, Marek Drewniak, Tomasz Steclik
2021 conf
ICCCI (CCIS Volume)
Anna-Lena Kampen, Marcin Fojcik, Rafal Cupek, Jacek Stój
2021 conf
ICCCI (CCIS Volume)
Rafal Cupek, Marcin Fojcik, Piotr Gaj, Jacek Stój
2021 B conf
WiMob
Anna-Lena Kampen, Marcin Fojcik, Rafal Cupek, Jacek Stój
2020 conf
ICCS (5)
Rafal Cupek, Marek Drewniak, Marcin Fojcik, Erik Kyrkjebø, Jerry Chun-Wei Lin, Dariusz Mrozek, Knut Øvsthus, Adam Ziebinski
2019 J jnl
IEEE Access
Rafal Cupek, Marek Drewniak, Adam Ziebinski, Marcin Fojcik
2019 conf
ICCCI (2)
Rafal Cupek, Lukasz Gólczynski, Adam Ziebinski
2019 B conf
SMC
Rafal Cupek, Marek Drewniak, Adam Ziebinski
2019 J jnl
Enterp. Inf. Syst.
Rafal Cupek, Adam Ziebinski, Marek Drewniak, Marcin Fojcik
2019 conf
ICCCI (2)
Marcin Fojcik, Rafal Cupek, Adam Ziebinski, Olav Sande, Martyna Katarzyna Fojcik
2019 conf
ICCCI (2)
Adam Ziebinski, Rafal Cupek, Marek Drewniak, Bartlomiej Wolny
2019 conf
ICCCI (2)
Adam Ziebinski, Rafal Cupek, Damian Grzechca
2018 conf
ICCCI (2)
Rafal Cupek, Adam Ziebinski, Marek Drewniak
2018 J jnl
Int. J. Comput. Integr. Manuf.
Rafal Cupek, Adam Ziebinski, Dariusz Zonenberg, Marek Drewniak
2018 conf
ACIIDS (2)
Rafal Cupek, Adam Ziebinski, Marek Drewniak, Marcin Fojcik
2018 conf
ACIIDS (2)
Rafal Cupek, Adam Ziebinski, Marek Drewniak, Marcin Fojcik
2017 conf
ICIT
Rafal Cupek, Adam Ziebinski, Marek Drewniak
2017 conf
BDAS
Rafal Cupek, Adam Ziebinski, Marcin Fojcik
2017 conf
ICCCI (2)
Rafal Cupek, Adam Ziebinski, Marek Drewniak, Marcin Fojcik
2017 conf
ICCCI (2)
Rafal Cupek, Jakub Duda, Dariusz Zonenberg, Lukasz Chlopas, Grzegorz Dziedziel, Marek Drewniak
2017 conf
ICCCI (2)
Rafal Cupek, Adam Ziebinski, Marek Drewniak, Marcin Fojcik
2017 conf
ICCCI (2)
Adam Ziebinski, Rafal Cupek, Marek Nalepa
2016 conf
ICCCI (2)
Konrad Wojciechowski, Bogdan Smolka, Rafal Cupek, Adam Ziebinski, Karolina Nurzynska, Marek Kulbacki, Jakub Segen, Marcin Fojcik, Pawel Mielnik, Sebastian Hein
2016 conf
ICCCI (2)
Adam Ziebinski, Rafal Cupek, Huseyin Erdogan, Sonja Wächter
2016 J jnl
Comput. Ind.
Rafal Cupek, Adam Ziebinski, Lukasz Huczala, Huseyin Erdogan
2015 conf
ICCCI (1)
Rafal Cupek, Huseyin Erdogan, Lukasz Huczala, Udo Wozar, Adam Ziebinski
2015 conf
ICIT
Rafal Cupek, Lukasz Huczala
2014 conf
ISIE
Rafal Cupek, Marek Drewniak, Dariusz Zonenberg
2013 conf
CN
Rafal Cupek, Kamil Folkert, Mateusz Starzyk
2013 C conf
IECON
Rafal Cupek, Kamil Folkert, Lukasz Huczala, Dariusz Zonenberg, Jakub Tomczyk
2013 J jnl
J. Circuits Syst. Comput.
Rafal Cupek, Adam Ziebinski, Maciej Franek
2013 C conf
IECON
Artur Frankiewicz, Rafal Cupek
2011 conf
UKSim
Aldona Maka, Rafal Cupek, Marcin Wierzchanowski
2011 conf
CN
Kamil Folkert, Marcin Fojcik, Rafal Cupek
2011 conf
CN
Rafal Cupek, Lukasz Huczala
2011 conf
CN
Michal Bochenek, Marcin Fojcik, Rafal Cupek
2011 conf
EMS
Aldona Maka, Rafal Cupek, Jakub Rosner
2010 conf
CN
Rafal Cupek, Piotr Piekos, Marcin Poczobutt, Adam Ziebinski
2010 conf
CN
Olav Sande, Marcin Fojcik, Rafal Cupek
2010 C conf
ETFA
Rafal Cupek, Aldona Maka
2009 conf
CN
Rafal Cupek, Marcin Fojcik, Olav Sande
2009 conf
CN
Rafal Cupek, Markus Bregulla, Lukasz Huczala
2009 C conf
ETFA
Rafal Cupek, Lukasz Huczala
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