Haiyang Shi

29 papers A* 1A 4B 1Journal 18Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
Environ. Model. Softw.
Haiyang Shi, Ximing Cai, Xinchen Hu, Alaa Jamal, Donghui Li, Chao Sun, Xin-Zhong Liang
2025 J jnl
CoRR
Jiaxin Shan, Varun Gupta, Le Xu, Haiyang Shi, Jingyuan Zhang, Ning Wang, Linhui Xu, Rong Kang, Tongping Liu, Yifei Zhang, Yiqing Zhu, Shuowei Jin, Gangmuk Lim, Binbin Chen, Zuzhi Chen, Xiao Liu, Xin Chen, Kante Yin, Chak-Pong Chung, Chenyu Jiang, Yicheng Lu, Jianjun Chen, Caixue Lin, Wu Xiang, Rui Shi, Liguang Xie
2025 J jnl
Environ. Model. Softw.
Haiyang Shi, Ximing Cai
2025 J jnl
CoRR
Kan Zhu, Haiyang Shi, Le Xu, Jiaxin Shan, Arvind Krishnamurthy, Baris Kasikci, Liguang Xie
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xueli Chang, Haiyang Shi, Tiejun Zhang, Huazhong Jin, Ao Xu
2024 J jnl
CoRR
Haiyang Shi
2024 J jnl
CoRR
Haiyang Shi
2024 J jnl
Inf. Sci.
Xin Zhang, Tao Yang, Hao Long, Haiyang Shi, Jiaxu Wang, Laihao Yang
2024 J jnl
CoRR
Haiyang Shi
2023 A* conf
ICDE
Jason Sun, Haoxiang Ma, Li Zhang, Huicong Liu, Haiyang Shi, Shangyu Luo, Kai Wu, Kevin Bruhwiler, Cheng Zhu, Yuanyuan Nie, Jianjun Chen, Lei Zhang, Yuming Liang
2023 J jnl
IEEE Trans. Instrum. Meas.
Yi Qin, Rui Yang, Haiyang Shi, Biao He, Yongfang Mao
2023 J jnl
Proc. VLDB Endow.
Jianjun Chen, Rui Shi, Heng Chen, Li Zhang, Ruidong Li, Wei Ding, Liya Fan, Hao Wang, Mu Xiong, Yuxiang Chen, Benchao Dong, Kuankuan Guo, Yuanjin Lin, Xiao Liu, Haiyang Shi, Peipei Wang, Zikang Wang, Yemeng Yang, Junda Zhao, Dongyan Zhou, Zhikai Zuo, Yuming Liang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Haiyang Shi, Olaf Hellwich, Geping Luo, Chunbo Chen, Huili He, Friday Uchenna Ochege, Tim Van de Voorde, Alishir Kurban, Philippe De Maeyer
2021 J jnl
IEEE Trans. Instrum. Meas.
Ruimin Song, Weigen Chen, Dingkun Yang, Haiyang Shi, Ruyue Zhang, Zewei Wang
2021 J jnl
IEEE Trans. Instrum. Meas.
Haiyang Shi, Yi Qin, Yi Wang, Houyi Bai, Xian Zhou
2021 J jnl
Remote. Sens.
Haiyang Shi, Qun Pan, Geping Luo, Olaf Hellwich, Chunbo Chen, Tim Van de Voorde, Alishir Kurban, Philippe De Maeyer, Shixin Wu
2021 J jnl
Remote. Sens.
Friday Uchenna Ochege, Haiyang Shi, Chaofan Li, Xiaofei Ma, Emeka Edwin Igboeli, Geping Luo
2021 A conf
SC
Tianxi Li, Haiyang Shi, Xiaoyi Lu
2020 J jnl
J. Comput. Sci. Technol.
Zheng-Hao Jin, Haiyang Shi, Ying-Xin Hu, Li Zha, Xiaoyi Lu
2020 A conf
SC
Haiyang Shi, Xiaoyi Lu
2019 B conf
KES
Haiyang Shi, Lijun Sun, Yue Teng, Xiangpei Hu
2019 A conf
SC
Haiyang Shi, Xiaoyi Lu
2019 A conf
HPDC
Haiyang Shi, Xiaoyi Lu, Dipti Shankar, Dhabaleswar K. Panda
2018 J jnl
IEEE Trans. Multi Scale Comput. Syst.
Xiaoyi Lu, Haiyang Shi, Rajarshi Biswas, M. Haseeb Javed, Dhabaleswar K. Panda
2018 conf
Bench
Haiyang Shi, Xiaoyi Lu, Dhabaleswar K. Panda
2018 conf
SoCC
Haiyang Shi, Xiaoyi Lu, Dipti Shankar, Dhabaleswar K. Panda
2018 conf
IEEE BigData
Xiaoyi Lu, Dipti Shankar, Haiyang Shi, Dhabaleswar K. Panda
2017 conf
Hot Interconnects
Xiaoyi Lu, Haiyang Shi, M. Haseeb Javed, Rajarshi Biswas, Dhabaleswar K. Panda
2017 conf
IEEE BigData
Xiaoyi Lu, Haiyang Shi, Dipti Shankar, Dhabaleswar K. Panda
redb/extractors/js_extractors/js_suspicious_apis.py
← Index redb/extractors/js_extractors/js_suspicious_apis.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.js_extractor import JSExtractor
from redb.extractors.js_extractors.js_patterns import CATEGORIES, PATTERNS


# Backwards-compatible export: `{category: [(raw_pattern_string, api_name), ...]}`
# in canonical PATTERNS insertion order (code_execution, network, filesystem,
# process, registry, crypto_encoding, dom_manipulation). Kept so external
# callers (notably JSDeobfuscationExtractor pre-cleanup) keep working until
# they are migrated to PATTERNS directly.
SUSPICIOUS_APIS: "dict[str, list[tuple[str, str]]]" = {}
for _name, _compiled in PATTERNS.items():
    SUSPICIOUS_APIS.setdefault(CATEGORIES[_name], []).append((_compiled.pattern, _name))


class JSSuspiciousAPIsExtractor(JSExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False, source=None, context=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, source, context=context,
        )
        self.api_findings = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.JS_SUSPICIOUS_APIS.value

    def _get_context_snippet(self, line, max_len=200):
        """Get a truncated context snippet around a match."""
        line = line.strip()
        if len(line) > max_len:
            return line[:max_len] + "..."
        return line

    def extract(self):
        src = self.js_source
        if not src:
            return None

        # Pass 1: shared per-sample scan over the raw source. The dict contains
        # entries for both PATTERNS and FEATURE_PATTERNS; the loop below only
        # consults PATTERNS keys, so feature-only entries are ignored.
        raw_scan = self._context.scan or {}
        raw_lines = self.lines

        # Pass 2: same patterns over the deobfuscated text, when the
        # deobfuscator produced something meaningfully different. APIs hidden
        # behind one obfuscation layer (Vjw0rm-style array.join + eval,
        # Dean-Edwards packers, jjencode, ...) only surface here. The scan is
        # cached on JSContext so JSDeobfuscationExtractor (which computes the
        # new_apis_found diff) reuses the same result.
        deobf_scan = self._context.scan_deobfuscated
        if deobf_scan:
            deobf_text, _ = self._context.deobfuscated
            deobf_lines = deobf_text.splitlines()
        else:
            deobf_lines = []

        findings = []
        # Iterate PATTERNS in canonical order so output is deterministic and
        # matches the historical category/pattern ordering. For each api_name,
        # raw findings take precedence; if an API is found only in the
        # deobfuscated text, we surface it as a row tagged revealed_by_deobf=1
        # with line numbers / snippets pulled from the deobfuscated source.
        for api_name in PATTERNS:
            raw_info = raw_scan.get(api_name)
            if raw_info:
                line_numbers = raw_info["lines"]
                lines_for_snippets = raw_lines
                revealed_by_deobf = 0
            else:
                deobf_info = deobf_scan.get(api_name)
                if not deobf_info:
                    continue
                line_numbers = deobf_info["lines"]
                lines_for_snippets = deobf_lines
                revealed_by_deobf = 1

            snippets = [
                self._get_context_snippet(lines_for_snippets[ln - 1])
                for ln in line_numbers[:3]
                if 0 < ln <= len(lines_for_snippets)
            ]
            findings.append({
                "api_name": api_name,
                "api_category": CATEGORIES[api_name],
                # Historical semantics: count = number of unique lines with a
                # match, not total in-source match count.
                "call_count": len(line_numbers),
                "line_numbers": line_numbers,
                "context_snippet": " | ".join(snippets),
                "revealed_by_deobf": revealed_by_deobf,
            })

        if not findings:
            return None

        self.api_findings = findings
        return findings

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.api_findings:
                return None

            current_time = datetime.now(timezone.utc)
            data = []
            for f in self.api_findings:
                data.append([
                    self.sha256,
                    f['api_name'],
                    f['api_category'],
                    f['call_count'],
                    f['line_numbers'],
                    f['context_snippet'],
                    f['revealed_by_deobf'],
                    current_time,
                ])

            column_names = [
                "sha256", "api_name", "api_category",
                "call_count", "line_numbers", "context_snippet",
                "revealed_by_deobf",
                "analysis_date",
            ]

            column_type_names = [
                "FixedString(64)", "String", "LowCardinality(String)",
                "UInt32", "Array(UInt32)", "String",
                "UInt8",
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_js_suspicious_apis"