Jaehoon Choi

88 papers A* 13A 6B 2Journal 49Unranked 18
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Jung Lee, Jaehoon Choi, Hyungwoo Song, Minjeong Shin, Bongwon Suh
2026 A* conf
CHI
Kyusik Kim, Jaehoon Choi, Hoyeol Yang, Hyunsoo Choi, Minchae Kim, Minjeong Shin, Bongwon Suh
2026 A* conf
AAAI
Jaehoon Choi, Dongki Jung, Chris Maxey, Sungmin Eum, Yonghan Lee, Dinesh Manocha, Heesung Kwon
2026 J jnl
CoRR
Dongki Jung, Jaehoon Choi, Adil Qureshi, Somi Jeong, Dinesh Manocha, Suyong Yeon
2025 conf
CHI Extended Abstracts
Minjeong Shin, Jaehoon Choi, Hyungwoo Song, Junghwan Kim, Bongwon Suh
2025 conf
IUI Companion
Hyungwoo Song, Minjeong Shin, Yeonjoon Kim, Kyochul Jang, Jaehoon Choi, Hyunggu Jung, Bongwon Suh
2025 A conf
ASSETS
Hyungwoo Song, Jaehoon Choi, Minjeong Shin, Bongwon Suh, Hyunggu Jung
2025 J jnl
CoRR
Sungbok Shin, Sunghyo Chung, Hyeon Jeon, Hyunwook Lee, Minje Choi, Taehun Kim, Jaehoon Choi, Sungahn Ko, Jaegul Choo
2025 A* conf
CVPR
Dongki Jung, Jaehoon Choi, Yonghan Lee, Somi Jeong, Taejae Lee, Dinesh Manocha, Suyong Yeon
2025 J jnl
CoRR
Dongki Jung, Jaehoon Choi, Yonghan Lee, Somi Jeong, Taejae Lee, Dinesh Manocha, Suyong Yeon
2025 J jnl
CoRR
Dongki Jung, Jaehoon Choi, Yonghan Lee, Dinesh Manocha
2025 J jnl
CoRR
Dongki Jung, Jaehoon Choi, Yonghan Lee, Sungmin Eum, Heesung Kwon, Dinesh Manocha
2025 J jnl
CoRR
Dongki Jung, Jaehoon Choi, Yonghan Lee, Dinesh Manocha
2025 J jnl
CoRR
Samarth Chopra, Jing Liang, Gershom Seneviratne, Yonghan Lee, Jaehoon Choi, Jianyu An, Stephen Cheng, Dinesh Manocha
2025 J jnl
CoRR
Yonghan Lee, Tsung-Wei Huang, Shiv Gehlot, Jaehoon Choi, Guan-Ming Su, Dinesh Manocha
2025 A conf
IROS
Christopher Maxey, Jaehoon Choi, Yonghan Lee, Hyungtae Lee, Dinesh Manocha, Heesung Kwon
2025 J jnl
CoRR
Jaehoon Choi, Dongki Jung, Christopher Maxey, Yonghan Lee, Sungmin Eum, Dinesh Manocha, Heesung Kwon
2025 J jnl
CoRR
Jaehoon Choi, Dongki Jung, Yonghan Lee, Sungmin Eum, Dinesh Manocha, Heesung Kwon
2024 A* conf
CVPR
Jaehoon Choi, Rajvi Shah, Qinbo Li, Yipeng Wang, Ayush Saraf, Changil Kim, Jia-Bin Huang, Dinesh Manocha, Suhib Alsisan, Johannes Kopf
2024 conf
ACCV (9)
Jaehoon Choi, Yonghan Lee, Hyungtae Lee, Heesung Kwon, Dinesh Manocha
2024 J jnl
CoRR
Jaehoon Choi, Yonghan Lee, Hyungtae Lee, Heesung Kwon, Dinesh Manocha
2024 J jnl
CoRR
Yonghan Lee, Jaehoon Choi, Dongki Jung, Jaeseong Yun, Soohyun Ryu, Dinesh Manocha, Suyong Yeon
2024 J jnl
CoRR
Christopher Maxey, Jaehoon Choi, Yonghan Lee, Hyungtae Lee, Dinesh Manocha, Heesung Kwon
2024 A* conf
ICRA
Christopher Maxey, Jaehoon Choi, Hyungtae Lee, Dinesh Manocha, Heesung Kwon
2023 conf
NIME
Jaehoon Choi
2023 conf
BCI
Jin Woo Choi, Jaehoon Choi, Sungho Jo
2023 conf
BCI
Haram Kwon, Jaehoon Choi, Jin Woo Choi, Sungho Jo
2023 A* conf
CVPR
Jaehoon Choi, Dongki Jung, Taejae Lee, Sangwook Kim, Youngdong Jung, Dinesh Manocha, Donghwan Lee
2023 J jnl
CoRR
Jaehoon Choi, Dongki Jung, Taejae Lee, Sangwook Kim, Youngdong Jung, Dinesh Manocha, Donghwan Lee
2023 J jnl
CoRR
Christopher Maxey, Jaehoon Choi, Hyungtae Lee, Dinesh Manocha, Heesung Kwon
2022 J jnl
Comput. Methods Programs Biomed.
Netiwit Kaongoen, Jaehoon Choi, Sungho Jo
2022 conf
BCI
Jaehoon Choi, Netiwit Kaongoen, Sungho Jo
2022 A* conf
ICRA
Jaehoon Choi, Dongki Jung, Yonghan Lee, Deokhwa Kim, Dinesh Manocha, Donghwan Lee
2022 J jnl
CoRR
Jaehoon Choi, Dongki Jung, Yonghan Lee, Deokhwa Kim, Dinesh Manocha, Donghwan Lee
2022 A conf
MobiSys
Jihoon Bang, Seungwoo Baek, Hanvit Kim, Hyeonjin Chung, Jaehoon Choi, Sunwoo Kim
2021 J jnl
IEEE Access
Woojin Kim, Jihoon Bang, Jaehoon Choi
2021 A* conf
ICCV
Dongki Jung, Jaehoon Choi, Yonghan Lee, Deokhwa Kim, Changick Kim, Dinesh Manocha, Donghwan Lee
2021 J jnl
CoRR
Dongki Jung, Jaehoon Choi, Yonghan Lee, Deokhwa Kim, Changick Kim, Dinesh Manocha, Donghwan Lee
2021 A* conf
ICCV
Taekyung Kim, Jaehoon Choi, Seokeon Choi, Dongki Jung, Changick Kim
2021 J jnl
IEEE Commun. Mag.
Jihoon Bang, Hyeonjin Chung, Junyeol Hong, Hyeongwook Seo, Jaehoon Choi, Sunwoo Kim
2021 A* conf
ICRA
Jaehoon Choi, Dongki Jung, Yonghan Lee, Deokhwa Kim, Dinesh Manocha, Donghwan Lee
2021 conf
BCI
Netiwit Kaongoen, Jaehoon Choi, Sungho Jo
2020 J jnl
IEEE Access
Jihoon Bang, Jaehoon Choi
2020 conf
BCI
Jaehoon Choi, Sungho Jo
2020 B conf
ICIP
Dongki Jung, Seunghan Yang, Jaehoon Choi, Changick Kim
2020 J jnl
CoRR
Dongki Jung, Seunghan Yang, Jaehoon Choi, Changick Kim
2020 J jnl
CoRR
Jaehoon Choi, Dongki Jung, Donghwan Lee, Changick Kim
2020 J jnl
CoRR
Jaehoon Choi, Dongki Jung, Yonghan Lee, Deokhwa Kim, Dinesh Manocha, Donghwan Lee
2019 J jnl
IEEE Access
Seongkyu Lee, Sunryul Kim, Youngmi Park, Jaehoon Choi
2019 A conf
BMVC
Jaehoon Choi, Minki Jeong, Taekyung Kim, Changick Kim
2019 J jnl
CoRR
Jaehoon Choi, Minki Jeong, Taekyung Kim, Changick Kim
2019 A* conf
ICCV
Jaehoon Choi, Taekyung Kim, Changick Kim
2019 J jnl
CoRR
Jaehoon Choi, Taekyung Kim, Changick Kim
2019 A* conf
ICCV
Seunghyeon Kim, Jaehoon Choi, Taekyung Kim, Changick Kim
2019 J jnl
CoRR
Seunghyeon Kim, Jaehoon Choi, Taekyung Kim, Changick Kim
2018 A conf
CIKM
Donghyeon Kim, Jinhyuk Lee, Donghee Choi, Jaehoon Choi, Jaewoo Kang
2018 J jnl
CoRR
Donghyeon Kim, Jinhyuk Lee, Donghee Choi, Jaehoon Choi, Jaewoo Kang
2017 J jnl
CoRR
Li Yi, Lin Shao, Manolis Savva, Haibin Huang, Yang Zhou, Qirui Wang, Benjamin Graham, Martin Engelcke, Roman Klokov, Victor S. Lempitsky, Yuan Gan, Pengyu Wang, Kun Liu, Fenggen Yu, Panpan Shui, Bingyang Hu, Yan Zhang, Yangyan Li, Rui Bu, Mingchao Sun, Wei Wu, Minki Jeong, Jaehoon Choi, Changick Kim, Angom Geetchandra, Narasimha Murthy, Bhargava Ramu, Bharadwaj Manda, M. Ramanathan, Gautam Kumar, P. Preetham, Siddharth Srivastava, Swati Bhugra, Brejesh Lall, Christian Häne, Shubham Tulsiani, Jitendra Malik, Jared Lafer, Ramsey Jones, Siyuan Li, Jie Lu, Shi Jin, Jingyi Yu, Qixing Huang, Evangelos Kalogerakis, Silvio Savarese, Pat Hanrahan, Thomas A. Funkhouser, Hao Su, Leonidas J. Guibas
2017 A* conf
IJCAI
Jinhyuk Lee, Hyunjae Kim, Miyoung Ko, Donghee Choi, Jaehoon Choi, Jaewoo Kang
2016 conf
IC-NIDC
Jinpil Tak, Jaehoon Choi
2016 conf
IC-NIDC
Junhyuk Kim, Jaehoon Lee, Hyowon Kim, Young-Mi Park, Jaehoon Choi, Keum-Cheol Hwang, Sunwoo Kim
2015 J jnl
Int. J. Distributed Sens. Networks
Sang-Woo Lee, Bong-Kwan Cho, Bonhyun Koo, Sang-Hwan Ryu, Jaehoon Choi, Sunwoo Kim
2015 J jnl
IEICE Trans. Commun.
Dong-Geun Choi, Ki-Hwea Kim, Jaehoon Choi
2015 conf
WWW (Companion Volume)
Jaehoon Choi, Donghyeon Kim, Donghee Choi, Sangrak Lim, Seongsoon Kim, Jaewoo Kang, Youngjae Choi
2014 conf
ICEIC
Kyeol Kwon, Jinpil Tak, Jaehoon Choi
2014 J jnl
IEICE Trans. Commun.
Xing Zhao, Jaehoon Choi
2014 conf
ICC
Sang-Woo Lee, Jaehoon Choi, Sunwoo Kim
2014 B conf
WCNC
Sang-Woo Lee, Jaehoon Choi, Sunwoo Kim
2013 J jnl
IEICE Trans. Commun.
Jisoo Baek, Youngki Lee, Jaehoon Choi
2013 J jnl
IEICE Trans. Commun.
Youngki Lee, Deukhyeon Ga, Daesung Park, Seokgon Lee, Jaehoon Choi
2013 J jnl
IEICE Electron. Express
Jaesu Park, Jaehoon Choi
2013 J jnl
J. Comput. Sci. Technol.
Jaehoon Choi, Jaewoo Kang, Jinseung Lee, Chihwan Song, Qingsong Jin, Sunwon Lee, Jinsun Uh
2012 J jnl
BMC Medical Informatics Decis. Mak.
Jaehoon Choi, Donghyeon Kim, Seongsoon Kim, Sunwon Lee, Kyubum Lee, Jaewoo Kang
2012 conf
WWW (Companion Volume)
Jaehoon Choi, Donghyeon Kim, Seongsoon Kim, Junkyu Lee, Sangrak Lim, Sunwon Lee, Jaewoo Kang
2012 A conf
CIKM
Jaehoon Choi, Donghyeon Kim, Seongsoon Kim, Junkyu Lee, Sangrak Lim, Sunwon Lee, Jaewoo Kang
2012 J jnl
IEICE Electron. Express
Soonyong Lee, Yeonsik Yu, Kyeol Kwon, Koichi Ito, Jaehoon Choi
2012 conf
IC-NIDC
Kyeol Kwon, Wonbum Seo, Soonyong Lee, Jaehoon Choi
2012 conf
BIBM
Kyubum Lee, Sunwon Lee, Minji Jeon, Jaehoon Choi, Jaewoo Kang
2012 J jnl
IEEE Trans. Consumer Electron.
Chunsu Ahn, Byoungjik Ahn, Sunwoo Kim, Jaehoon Choi
2011 J jnl
IEICE Trans. Commun.
Uisheon Kim, Jaehoon Choi
2011 J jnl
IEICE Electron. Express
Soonyong Lee, Wonbum Seo, Koichi Ito, Jaehoon Choi
2010 J jnl
IEICE Trans. Commun.
Uisheon Kim, Gyubong Jung, Jaehoon Choi
2009 J jnl
IEICE Trans. Commun.
Youngki Lee, Jeongpyo Kim, Jaehoon Choi
2009 J jnl
IEICE Electron. Express
Jeongpyo Kim, Haeil Chung, Jaehoon Choi
2008 J jnl
IEICE Trans. Commun.
Yeonsik Yu, Jeongpyo Kim, Jaehoon Choi
2006 J jnl
IEICE Trans. Commun.
Jihak Jung, Wooyoung Choi, Jaehoon Choi
2006 J jnl
IEICE Trans. Commun.
Hoon Park, Jaehoon Choi
1995 J jnl
Signal Process.
Seungwon Choi, Tapan K. Sarkar, Jaehoon Choi
redb/extractors/malcontent.py
← Index redb/extractors/malcontent.py python
import inspect
import json
import subprocess
from typing import Any
from datetime import datetime, timezone

from redb.extractors.enum import Tag
from redb.models.dataclasses import Malcontent
from redb.extractors.extractor import Extractor
from dotenv import load_dotenv
import os

load_dotenv(override=True)


class MalcontentExtractor(Extractor):
    """
    Extractor for malcontent tool from chainguard-dev/malcontent.

    Malcontent discovers supply-chain compromises through context, differential
    analysis, and 14,000+ YARA rules. It analyzes binaries and code to detect
    malicious content and suspicious behavioral patterns.

    Binary can be extracted from Docker image:
        docker cp $(docker create cgr.dev/chainguard/malcontent:latest):/usr/bin/mal /usr/local/bin/mal

    Stores full JSON output for materialized view extraction.
    """

    # Cache version at class level to avoid repeated subprocess calls
    _cached_version = None

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious
        )
        self.malcontent = None

    @classmethod
    def _get_malcontent_version(cls, log) -> str:
        """Get malcontent version, cached at class level."""
        if cls._cached_version is not None:
            return cls._cached_version

        malcontent_path = os.getenv("MALCONTENT_PATH", "/usr/local/bin/mal")
        try:
            result = subprocess.run(
                [malcontent_path, "--version"],
                capture_output=True,
                text=True,
                timeout=10
            )
            version_output = result.stdout.strip()
            if result.returncode == 0 and version_output:
                # Parse "malcontent version v1.21.5" -> "1.21.5"
                if version_output.startswith("malcontent version v"):
                    version_output = version_output[len("malcontent version v"):]
                elif version_output.startswith("malcontent version "):
                    version_output = version_output[len("malcontent version "):]
                cls._cached_version = version_output
            else:
                cls._cached_version = "unknown"
        except Exception as e:
            log.warning(f"Could not get malcontent version: {e}")
            cls._cached_version = "unknown"

        return cls._cached_version

    def _extract_malcontent(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        TIMEOUT = int(os.getenv("MALCONTENT_TIMEOUT", "300"))
        malcontent_path = os.getenv("MALCONTENT_PATH", "/usr/local/bin/mal")

        malcontent_command = [malcontent_path, "analyze", "--format=json", self.filepath]

        import signal

        try:
            process = subprocess.Popen(
                malcontent_command,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid
            )

            try:
                stdout, stderr = process.communicate(timeout=TIMEOUT)
                if process.returncode != 0:
                    self.log.error(f"Error running malcontent, return code: {process.returncode}, stderr: {stderr}")
                    return {}
            except subprocess.TimeoutExpired:
                self.log.warning(f"The malcontent command timed out after {TIMEOUT} seconds, terminating process group")
                try:
                    os.killpg(process.pid, signal.SIGTERM)
                    try:
                        process.wait(timeout=3)
                    except subprocess.TimeoutExpired:
                        self.log.warning("Process didn't terminate with SIGTERM, sending SIGKILL")
                        os.killpg(process.pid, signal.SIGKILL)
                    process.wait()
                except (ProcessLookupError, OSError) as e:
                    self.log.warning(f"Error while killing process: {e}")
                return {}

            try:
                malcontent_output = json.loads(stdout)
            except json.JSONDecodeError as e:
                self.log.error(f"Error parsing malcontent output: {e}")
                return {}

            # Unwrap the Files/<path> structure to get the inner content
            # Structure is: {"Files": {"/path/to/file": {<actual content>}}}
            files_dict = malcontent_output.get("Files", {})
            if not files_dict:
                self.log.warning("Malcontent output has no 'Files' key")
                return {}

            # Get the first (and only) file's content
            file_content = next(iter(files_dict.values()), {})
            if not file_content:
                self.log.warning("Malcontent output has empty file content")
                return {}

            # Extract risk score and level from the unwrapped content
            risk_score = file_content.get("RiskScore", 0)
            risk_level = file_content.get("RiskLevel", "")

            version = self._get_malcontent_version(self.log)

            self.malcontent = Malcontent(
                malcontent_dump=json.dumps(file_content),
                version=version,
                risk_score=risk_score,
                risk_level=risk_level
            )
            self.log.debug(f"Malcontent analysis complete, version={version}, risk={risk_level}({risk_score})")

        except Exception as e:
            self.log.error(f"Unexpected error in malcontent extraction: {str(e)}")
            if 'process' in locals() and process.poll() is None:
                try:
                    os.killpg(process.pid, signal.SIGKILL)
                    process.wait()
                except:
                    pass
            return {}

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)

            data = [[
                self.sha256,
                current_time,
                self.malcontent.version,
                self.malcontent.risk_score,
                self.malcontent.risk_level,
                self.malcontent.malcontent_dump
            ]]

            column_names = [
                'sha256', 'analysis_date',
                'malcontent_version', 'malcontent_risk_score', 'malcontent_risk_level',
                'malcontent_json'
            ]

            column_type_names = [
                'FixedString(64)',
                'DateTime64(3, \'UTC\')',
                'LowCardinality(String)', 'UInt8', 'LowCardinality(String)',
                'JSON'
            ]

            return (data, column_names, column_type_names)

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

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_malcontent()
            return self.malcontent
        except Exception as e:
            self.log.error(f"Error extracting malcontent: {e}")
            return None

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