Hakima Chaouchi

88 papers A 2B 17C 2Misc 1Journal 26Unranked 36
YearRankTypeTitle / Venue / Authors
2026 Misc conf
ICNC
Hakima Chaouchi, Bilal Ghani
2023 conf
ICUFN
Rémi Bouchayer, Jae-Yun Jun, Hakima Chaouchi, Philippe Millet
2021 B conf
IWCMC
Amal Bouaziz, Ahlem Saddoud, Lamia Chaari Fourati, Hakima Chaouchi
2021 B conf
IM
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2021 B conf
IM
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2020 J jnl
CoRR
Mao V. Ngo, Hakima Chaouchi, Tie Luo, Tony Q. S. Quek
2020 A conf
ICDCS
Mao V. Ngo, Tie Luo, Hakima Chaouchi, Tony Q. S. Quek
2020 J jnl
CoRR
Mao V. Ngo, Tie Luo, Hakima Chaouchi, Tony Q. S. Quek
2020 B conf
EWSN
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2020 conf
ICAIIC
Naman Singh Negi, Ons Jelassi, Hakima Chaouchi, Stéphan Clémençon
2020 conf
BCCA
Aman Pandey, Hakima Chaouchi
2020 B conf
EWSN
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2020 B conf
EWSN
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2020 conf
IOT
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2019 J jnl
IEEE Access
Sebti Mouelhi, Mohamed-Emine Laarouchi, Daniela Cancila, Hakima Chaouchi
2018 conf
ADHOC-NOW
Amal Bouaziz, Ahlem Saddoud, Lamia Chaari Fourati, Hakima Chaouchi
2018 ed.
InterIoT/SaSeIoT
Giancarlo Fortino, Carlos Enrique Palau, Antonio Guerrieri, Nora Cuppens, Frédéric Cuppens, Hakima Chaouchi, Alban Gabillon
2018 conf
FiCloud
Nahit Pawar, Thomas Bourgeau, Hakima Chaouchi
2017 ed.
InterIoT/SaSeIoT
Nathalie Mitton, Hakima Chaouchi, Thomas Noël, Thomas Watteyne, Alban Gabillon, Patrick Capolsini
2017 J jnl
IEEE Trans. Wirel. Commun.
Giovanni Giambene, Van Anh Le, Thomas Bourgeau, Hakima Chaouchi
2016 C conf
APCC
Ichrak Amdouni, Fatma Hrizi, Anis Laouiti, Eduard Grasa, Hakima Chaouchi
2016 J jnl
Mob. Inf. Syst.
Jacques Bou Abdo, Thomas Bourgeau, Jacques Demerjian, Hakima Chaouchi
2016 ed.
IoT 360 (1)
Benny Mandler, Johann Marquez-Barja, Miguel Elias Mitre Campista, Dagmar Cagánová, Hakima Chaouchi, Sherali Zeadally, Mohamad Badra, Stefano Giordano, Maria Fazio, Andrey Somov, Radu-Laurentiu Vieriu
2016 ed.
IoT 360 (2)
Benny Mandler, Johann Marquez-Barja, Miguel Elias Mitre Campista, Dagmar Cagánová, Hakima Chaouchi, Sherali Zeadally, Mohamad Badra, Stefano Giordano, Maria Fazio, Andrey Somov, Radu-Laurentiu Vieriu
2016 J jnl
Comput. Stand. Interfaces
Pinar Kirci, Hakima Chaouchi
2015 J jnl
Wirel. Networks
Mauro Sérgio Pereira Fonseca, Anelise Munaretto, Christian Mendes, Hakima Chaouchi
2015 J jnl
IEEE Trans. Mob. Comput.
Haoyi Xiong, Daqing Zhang, Leye Wang, Hakima Chaouchi
2015 conf
FiCloud
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Talar Atéchian
2015 conf
GSCIT
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Rami Yared, Talar Atéchian
2015 conf
DICTAP
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Talar Atéchian, Carole Bassil
2015 conf
NOF
Fatma Hrizi, Anis Laouiti, Hakima Chaouchi
2015 J jnl
Unmanned Syst.
Wendong Xiao, Apostolia Papapostolou, Hakima Chaouchi, Ming Wei
2015 conf
ICC
Giovanni Giambene, Van Anh Le, Thomas Bourgeau, Hakima Chaouchi
2014 conf
HPCC/CSS/ICESS
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle, Talar Atéchian
2014 conf
IWSSIP
Pinar Kirci, Hakima Chaouchi, Anis Laouiti
2014 B conf
WCNC
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle
2014 conf
FiCloud
Pinar Kirci, Hakima Chaouchi, Anis Laouiti
2014 J jnl
J. Supercomput.
Priyanka Rawat, Kamal Deep Singh, Hakima Chaouchi, Jean-Marie Bonnin
2013 conf
ICITST
Jacques Bou Abdo, Jacques Demerjian, Hakima Chaouchi, Kablan Barbar, Guy Pujolle
2013 J jnl
J. Supercomput.
Apostolia Papapostolou, Hakima Chaouchi
2013 J jnl
Telecommun. Syst.
Apostolia Papapostolou, Vasilis Friderikos, Tara Ali-Yahiya, Hakima Chaouchi
2012 J jnl
Wirel. Networks
Apostolia Papapostolou, Hakima Chaouchi
2011 conf
ISCIS
Gulsum Zeynep Gurkas Aydin, Abdul Halim Zaim, Hakima Chaouchi, Tülin Atmaca
2011 B conf
IWCMC
Apostolia Papapostolou, Wendong Xiao, Hakima Chaouchi
2011 conf
RFID-TA
Oscar Botero, Hakima Chaouchi
2011 conf
ANT/MobiWIS
Oscar Botero, Hakima Chaouchi
2011 J jnl
J. Netw. Comput. Appl.
Apostolia Papapostolou, Hakima Chaouchi
2011 J jnl
Ann. des Télécommunications
Apostolia Papapostolou, Hakima Chaouchi
2010 J jnl
EURASIP J. Wirel. Commun. Netw.
Tara Ali-Yahiya, Hakima Chaouchi
2010 B conf
WCNC
Apostolia Papapostolou, Hakima Chaouchi
2010 conf
AICT
Arraez Leonardo, Hakima Chaouchi
2010 B conf
ICCCN
Tara Ali-Yahiya, Hakima Chaouchi
2010 conf
GreenCom/CPSCom
Oscar Botero, Hakima Chaouchi
2010 B conf
PIMRC
Gulsum Zeynep Gurkas Aydin, Tara Ali-Yahiya, Hakima Chaouchi, Abdul Halim Zaim
2010 conf
CCNC
Apostolia Papapostolou, Hakima Chaouchi
2009 conf
NEW2AN
Tara Ali-Yahiya, Hakima Chaouchi
2009 conf
PM2HW2N@MSWiM
Tara Ali-Yahiya, Hakima Chaouchi
2009 conf
WMNC/PWC
Apostolia Papapostolou, Hakima Chaouchi
2009 J jnl
J. Comput. Networks Commun.
Maher Ben Jemaa, Nahla Abid, Maryline Laurent-Maknavicius, Hakima Chaouchi
2009 B conf
PIMRC
Apostolia Papapostolou, Hakima Chaouchi
2009 B conf
IWCMC
Apostolia Papapostolou, Hakima Chaouchi
2009 conf
Wireless Days
Oscar Botero, Hakima Chaouchi
2009 conf
NTMS
Apostolia Papapostolou, Hakima Chaouchi
2009 conf
NEW2AN
Apostolia Papapostolou, Vasilis Friderikos, Tara Ali-Yahiya, Hakima Chaouchi
2009 B conf
Networking
Apostolia Papapostolou, Hakima Chaouchi
2009 conf
Mobility Conference
Gulsum Zeynep Gurkas Aydin, Hakima Chaouchi, Abdul Halim Zaim
2008 conf
Wireless Days
Sampath N. Ranasinghe, Hakima Chaouchi, Vasilis Friderikos, Hamid Aghvami
2008 B conf
ARES
Amir R. Khakpour, Maryline Laurent-Maknavicius, Hakima Chaouchi
2007 A conf
IPDPS
Amir R. Khakpour, Hakima Chaouchi
2006 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Ivan Ganchev, Mairtin O'Droma, Matthias Siebert, Faouzi Bader, Hakima Chaouchi, Ivan Armuelles Voinov, Isabelle M. Demeure, Fintan McEvoy
2006 J jnl
Telecommun. Syst.
Guy Pujolle, Hakima Chaouchi, Dominique Gaïti
2006 J jnl
IEEE Intell. Syst.
Radhika Nagpal, Franco Zambonelli, Emin Gün Sirer, Hakima Chaouchi, Mikhail I. Smirnov
2006 J jnl
Int. J. Netw. Manag.
Hakima Chaouchi, Ivan Armuelles Voinov, Ivan Ganchev, Máirtín O'Droma, Nino Kubinidze
2006 conf
Mobility Conference
Tara Ali-Yahiya, Hakima Chaouchi, André-Luc Beylot, Guy Pujolle
2005 C conf
ISADS
Guy Pujolle, Hakima Chaouchi
2005 J jnl
Ann. des Télécommunications
Guy Pujolle, Hakima Chaouchi
2004 J jnl
Int. J. Netw. Manag.
Hakima Chaouchi
2004 J jnl
Wirel. Networks
Hakima Chaouchi, Anelise Munaretto
2004 conf
Net-Con
Guy Pujolle, Hakima Chaouchi, Dominique Gaïti
2004 B conf
PIMRC
Hakima Chaouchi, Guy Pujolle
2004 J jnl
Int. J. Netw. Manag.
Hakima Chaouchi, Pedro Marques Antunes
2004 J jnl
Ann. des Télécommunications
Hakima Chaouchi
2003 conf
Net-Con
Hakima Chaouchi
2002 conf
SMARTNET
Nadia Boukhatem, Benoit Campedel, Brahim Chakeur, Hakima Chaouchi, Vincent Guyot, Francine Krief, Thi Mai Trang Nguyen, Guy Pujolle
2002 B conf
NETWORKING
Hakima Chaouchi, Guy Pujolle
2002 conf
Net-Con
Hakima Chaouchi
2002 conf
MWCN
Hakima Chaouchi, Guy Pujolle, Hossam Afifi, Hahnsang Kim
2002 conf
Communication Systems: The State of the Art (IFIP World Computer Congress)
Guy Pujolle, Hakima Chaouchi
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