Oluwasanmi Koyejo

116 papers A* 12A 16Journal 66Unranked 22
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Willy Chan, Michael Souliman, Jakob Nordhagen, Brando Miranda, Elyas Obbad, Oluwasanmi Koyejo
2023 J jnl
CoRR
Rylan Schaeffer, Mikail Khona, Zachary Robertson, Akhilan Boopathy, Kateryna Pistunova, Jason W. Rocks, Ila Rani Fiete, Oluwasanmi Koyejo
2023 J jnl
CoRR
Enyi Jiang, Yibo Jacky Zhang, Oluwasanmi Koyejo
2023 J jnl
CoRR
Pablo Robles-Granda, Katherine Tsai, Oluwasanmi Koyejo
2023 J jnl
CoRR
Zachary Robertson, Oluwasanmi Koyejo
2023 J jnl
CoRR
Zachary Robertson, Oluwasanmi Koyejo
2022 J jnl
J. Mach. Learn. Res.
Katherine Tsai, Mladen Kolar, Oluwasanmi Koyejo
2022 J jnl
CoRR
Ibrahim Alabdulmohsin, Jessica Schrouff, Oluwasanmi Koyejo
2022 conf
NAACL-HLT
Yong Xie, Dakuo Wang, Pin-Yu Chen, Jinjun Xiong, Sijia Liu, Oluwasanmi Koyejo
2022 J jnl
CoRR
Xiaojun Xu, Jacky Yibo Zhang, Evelyn Ma, Danny Son, Oluwasanmi Koyejo, Bo Li
2022 J jnl
CoRR
Maohao Shen, Bowen Jiang, Jacky Yibo Zhang, Oluwasanmi Koyejo
2022 J jnl
CoRR
Peiye Zhuang, Liqian Ma, Oluwasanmi Koyejo, Alexander G. Schwing
2022 conf
CLeaR
Xiaoyang Wang, Klara Nahrstedt, Oluwasanmi Koyejo
2022 J jnl
CoRR
Katherine Tsai, Boxin Zhao, Oluwasanmi Koyejo, Mladen Kolar
2022 J jnl
CoRR
Jessica Schrouff, Natalie Harris, Oluwasanmi Koyejo, Ibrahim Alabdulmohsin, Eva Schnider, Krista Opsahl-Ong, Alexander Brown, Subhrajit Roy, Diana Mincu, Christina Chen, Awa Dieng, Yuan Liu, Vivek Natarajan, Alan Karthikesalingam, Katherine A. Heller, Silvia Chiappa, Alexander D'Amour
2022 J jnl
CoRR
Safinah Ali, Sohini Upadhyay, Gaurush Hiranandani, Elena L. Glassman, Oluwasanmi Koyejo
2022 A conf
UAI
Gaurush Hiranandani, Jatin Mathur, Harikrishna Narasimhan, Oluwasanmi Koyejo
2022 J jnl
CoRR
Peiye Zhuang, Bliss Chapman, Ran Li, Oluwasanmi Koyejo
2022 J jnl
CoRR
Olawale Salaudeen, Oluwasanmi Koyejo
2022 J jnl
IEEE Trans. Cybern.
Zengjie Song, Oluwasanmi Koyejo, Jiangshe Zhang
2022 J jnl
Algorithms
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta
2021 A* conf
ICLR
Peiye Zhuang, Oluwasanmi Koyejo, Alexander G. Schwing
2021 J jnl
CoRR
Peiye Zhuang, Oluwasanmi Koyejo, Alexander G. Schwing
2021 J jnl
CoRR
Katherine Tsai, Oluwasanmi Koyejo, Mladen Kolar
2021 conf
ISBI
Maohao Shen, Jacky Y. Zhang, Leihao Chen, Weiman Yan, Neel Jani, Brad Sutton, Oluwasanmi Koyejo
2021 conf
ISBI
Patrick Cole, Ayis Pyrros, Oluwasanmi Koyejo
2021 J jnl
Brain Informatics
James M. Shine, Mike Li, Oluwasanmi Koyejo, Ben D. Fulcher, Joseph T. Lizier
2021 J jnl
CoRR
Gaurush Hiranandani, Jatin Mathur, Oluwasanmi Koyejo, Mahdi Milani Fard, Harikrishna Narasimhan
2021 J jnl
CoRR
Raj Kiriti Velicheti, Derek Xia, Oluwasanmi Koyejo
2020 J jnl
CoRR
Katherine Tsai, Mladen Kolar, Oluwasanmi Koyejo
2020 J jnl
CoRR
Jacky Y. Zhang, Rajiv Khanna, Anastasios Kyrillidis, Oluwasanmi Koyejo
2020 A* conf
NeurIPS
Cong Xie, Shuai Zheng, Oluwasanmi Koyejo, Indranil Gupta, Mu Li, Haibin Lin
2020 J jnl
CoRR
Cong Xie, Shuai Zheng, Oluwasanmi Koyejo, Indranil Gupta, Mu Li, Haibin Lin
2020 J jnl
Bioinform.
Sarah A. Christensen, Juho Kim, Nicholas Chia, Oluwasanmi Koyejo, Mohammed El-Kebir
2020 J jnl
CoRR
Kaizhao Liang, Jacky Y. Zhang, Oluwasanmi Koyejo, Bo Li
2020 A* conf
NeurIPS
Gaurush Hiranandani, Harikrishna Narasimhan, Oluwasanmi Koyejo
2020 J jnl
CoRR
Gaurush Hiranandani, Harikrishna Narasimhan, Oluwasanmi Koyejo
2020 A* conf
NeurIPS
Forest Yang, Mouhamadou Cisse, Oluwasanmi Koyejo
2020 J jnl
CoRR
Gaurush Hiranandani, Jatin Mathur, Harikrishna Narasimhan, Oluwasanmi Koyejo
2020 J jnl
CoRR
Amar Budhiraja, Gaurush Hiranandani, Navya Yarrabelly, Ayush Choure, Oluwasanmi Koyejo, Prateek Jain
2020 J jnl
CoRR
Zengjie Song, Oluwasanmi Koyejo, Jiangshe Zhang
2020 A* conf
ICLR
Haroun Habeeb, Oluwasanmi Koyejo
2019 A conf
WSDM
Gaurush Hiranandani, Raghav Somani, Oluwasanmi Koyejo, Sreangsu Acharyya
2019 J jnl
CoRR
Xiaoyan Wang, Ran Li, Bowei Yan, Oluwasanmi Koyejo
2019 J jnl
J. Mach. Learn. Res.
Anqi Wu, Oluwasanmi Koyejo, Jonathan W. Pillow
2019 conf
ISBI
Peiye Zhuang, Alexander G. Schwing, Oluwasanmi Koyejo
2019 A conf
UAI
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta
2019 A conf
UAI
Sinong Geng, Mladen Kolar, Oluwasanmi Koyejo
2019 J jnl
CoRR
Zengjie Song, Oluwasanmi Koyejo, Jiangshe Zhang
2019 A* conf
NeurIPS
Jacky Y. Zhang, Rajiv Khanna, Anastasios Kyrillidis, Oluwasanmi Koyejo
2019 J jnl
CoRR
Jacky Y. Zhang, Rajiv Khanna, Anastasios Kyrillidis, Oluwasanmi Koyejo
2019 J jnl
CoRR
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta, Haibin Lin
2019 A* conf
NeurIPS
Gaurush Hiranandani, Shant Boodaghians, Ruta Mehta, Oluwasanmi Koyejo
2019 J jnl
CoRR
Sinong Geng, Minhao Yan, Mladen Kolar, Oluwasanmi Koyejo
2019 A conf
AISTATS
Gaurush Hiranandani, Shant Boodaghians, Ruta Mehta, Oluwasanmi Koyejo
2019 conf
ECML/PKDD (2)
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta
2019 J jnl
CoRR
Shalmali Joshi, Oluwasanmi Koyejo, Warut Vijitbenjaronk, Been Kim, Joydeep Ghosh
2018 A conf
AISTATS
Michael Riis Andersen, Ole Winther, Lars Kai Hansen, Russell A. Poldrack, Oluwasanmi Koyejo
2018 A* conf
ICML
Bowei Yan, Oluwasanmi Koyejo, Kai Zhong, Pradeep Ravikumar
2018 J jnl
CoRR
Bowei Yan, Oluwasanmi Koyejo, Kai Zhong, Pradeep Ravikumar
2018 A conf
UAI
Yizhi Zhu, Oluwasanmi Koyejo
2018 J jnl
CoRR
Gaurush Hiranandani, Raghav Somani, Oluwasanmi Koyejo, Sreangsu Acharyya
2018 J jnl
CoRR
Gaurush Hiranandani, Shant Boodaghians, Ruta Mehta, Oluwasanmi Koyejo
2018 J jnl
CoRR
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta
2018 J jnl
CoRR
Rajiv Khanna, Been Kim, Joydeep Ghosh, Oluwasanmi Koyejo
2018 J jnl
CoRR
Sinong Geng, Mladen Kolar, Oluwasanmi Koyejo
2018 J jnl
CoRR
Y. Cem Sübakan, Oluwasanmi Koyejo, Paris Smaragdis
2018 J jnl
CoRR
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta
2018 J jnl
CoRR
Cong Xie, Oluwasanmi Koyejo, Indranil Gupta
2018 J jnl
CoRR
Shalmali Joshi, Oluwasanmi Koyejo, Been Kim, Joydeep Ghosh
2017 A conf
SDM
Rajiv Khanna, Joydeep Ghosh, Russell A. Poldrack, Oluwasanmi Koyejo
2017 A* conf
ICML
Krzysztof Dembczynski, Wojciech Kotlowski, Oluwasanmi Koyejo, Nagarajan Natarajan
2017 J jnl
PLoS Comput. Biol.
Timothy N. Rubin, Oluwasanmi Koyejo, Krzysztof J. Gorgolewski, Michael N. Jones, Russell A. Poldrack, Tal Yarkoni
2017 A conf
AISTATS
Avradeep Bhowmik, Joydeep Ghosh, Oluwasanmi Koyejo
2017 A conf
AISTATS
Rajiv Khanna, Joydeep Ghosh, Russell A. Poldrack, Oluwasanmi Koyejo
2017 J jnl
NeuroImage
Ro'ee Gilron, Jonathan D. Rosenblatt, Oluwasanmi Koyejo, Russell A. Poldrack, Roy Mukamel
2016 A* conf
ICML
Megasthenis Asteris, Anastasios Kyrillidis, Oluwasanmi Koyejo, Russell A. Poldrack
2016 J jnl
CoRR
Megasthenis Asteris, Anastasios Kyrillidis, Oluwasanmi Koyejo, Russell A. Poldrack
2016 conf
NIPS
Been Kim, Oluwasanmi Koyejo, Rajiv Khanna
2016 conf
NIPS
Timothy N. Rubin, Oluwasanmi Koyejo, Michael N. Jones, Tal Yarkoni
2016 J jnl
CoRR
Avradeep Bhowmik, Joydeep Ghosh, Oluwasanmi Koyejo
2016 J jnl
CoRR
Rajiv Khanna, Joydeep Ghosh, Russell A. Poldrack, Oluwasanmi Koyejo
2016 A* conf
ICML
Nagarajan Natarajan, Oluwasanmi Koyejo, Pradeep Ravikumar, Inderjit S. Dhillon
2016 conf
NIPS
Suriya Gunasekar, Oluwasanmi Koyejo, Joydeep Ghosh
2016 J jnl
CoRR
Suriya Gunasekar, Oluwasanmi Koyejo, Joydeep Ghosh
2016 J jnl
Mach. Learn.
Shalmali Joshi, Joydeep Ghosh, Mark Reid, Oluwasanmi Koyejo
2016 A* conf
ICML
Avradeep Bhowmik, Joydeep Ghosh, Oluwasanmi Koyejo
2015 conf
NIPS
Oluwasanmi Koyejo, Nagarajan Natarajan, Pradeep Ravikumar, Inderjit S. Dhillon
2015 J jnl
NeuroImage
James M. Shine, Oluwasanmi Koyejo, Peter T. Bell, Krzysztof J. Gorgolewski, Moran Gilat, Russell A. Poldrack
2015 A conf
AISTATS
Avradeep Bhowmik, Joydeep Ghosh, Oluwasanmi Koyejo
2015 J jnl
CoRR
Nagarajan Natarajan, Oluwasanmi Koyejo, Pradeep Ravikumar, Inderjit S. Dhillon
2015 conf
ICHI
Shalmali Joshi, Oluwasanmi Koyejo, Kristine Resurreccion, Joydeep Ghosh
2015 conf
ICHI
Shalmali Joshi, Oluwasanmi Koyejo, Joydeep Ghosh
2015 A conf
AISTATS
Rajiv Khanna, Joydeep Ghosh, Russell A. Poldrack, Oluwasanmi Koyejo
2014 J jnl
CoRR
Oluwasanmi Koyejo, Cheng H. Lee, Joydeep Ghosh
2014 J jnl
Mach. Learn.
Oluwasanmi Koyejo, Cheng H. Lee, Joydeep Ghosh
2014 conf
NIPS
Oluwasanmi Koyejo, Nagarajan Natarajan, Pradeep Ravikumar, Inderjit S. Dhillon
2014 conf
NIPS
Oluwasanmi Koyejo, Rajiv Khanna, Joydeep Ghosh, Russell A. Poldrack
2014 conf
NIPS
Anqi Wu, Mijung Park, Oluwasanmi Koyejo, Jonathan W. Pillow
2013 A conf
AISTATS
Mijung Park, Oluwasanmi Koyejo, Joydeep Ghosh, Russell A. Poldrack, Jonathan W. Pillow
2013 A conf
UAI
Oluwasanmi Koyejo, Joydeep Ghosh
2013 J jnl
CoRR
Oluwasanmi Koyejo, Joydeep Ghosh
2013 conf
ICDM Workshops
Oluwasanmi Koyejo, Cheng H. Lee, Joydeep Ghosh
2013 conf
EMBC
Cheng H. Lee, Oluwasanmi Koyejo, Joydeep Ghosh
2013 conf
PRNI
Oluwasanmi Koyejo, Priyank Patel, Joydeep Ghosh, Russell A. Poldrack
2013 A conf
RecSys
Oluwasanmi Koyejo, Sreangsu Acharyya, Joydeep Ghosh
2013 J jnl
CoRR
Oluwasanmi Koyejo, Cheng H. Lee, Joydeep Ghosh
2013 J jnl
Frontiers Neuroinformatics
Russell A. Poldrack, Deanna M. Barch, Jason P. Mitchell, Tor D. Wager, Anthony D. Wagner, Joseph T. Devlin, Chad Cumba, Oluwasanmi Koyejo, Michael P. Milham
2012 J jnl
CoRR
Sreangsu Acharyya, Oluwasanmi Koyejo, Joydeep Ghosh
2012 A conf
UAI
Sreangsu Acharyya, Oluwasanmi Koyejo, Joydeep Ghosh
2011 conf
HetRec@RecSys
Oluwasanmi Koyejo, Joydeep Ghosh
2011 J jnl
AI Mag.
Roger Azevedo, Gautam Biswas, Dan Bohus, Ted Carmichael, Mark A. Finlayson, Mirsad Hadzikadic, Catherine Havasi, Eric Horvitz, Takayuki Kanda, Oluwasanmi Koyejo, William F. Lawless, Douglas B. Lenat, Felipe Meneguzzi, Bilge Mutlu, Jean Oh, Roberto Pirrone, Antoine Raux, Donald A. Sofge, Gita Sukthankar, Benjamin Van Durme
2010 conf
AAAI Fall Symposium: Manifold Learning and Its Applications
Oluwasanmi Koyejo, Richard Souvenir
2010 conf
AAAI Fall Symposium: Manifold Learning and Its Applications
Oluwasanmi Koyejo, Richard Souvenir
2010 J jnl
AI Mag.
Roger Azevedo, Trevor J. M. Bench-Capon, Gautam Biswas, Ted Carmichael, Nancy L. Green, Mirsad Hadzikadic, Oluwasanmi Koyejo, Unmesh Kurup, Simon Parsons, Roberto Pirrone, Henry Prakken, Alexei V. Samsonovich, Donia Scott, Richard Souvenir
2009 conf
AAAI Fall Symposium: Manifold Learning and Its Applications
Oluwasanmi Koyejo, Joydeep Ghosh
redb/extractors/apk_extractors/apk_inconsistency_tests.py
← Index redb/extractors/apk_extractors/apk_inconsistency_tests.py python
import inspect
import re
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKInconsistencyTests

# Emulator detection indicator strings
EMULATOR_INDICATORS = {
    "generic", "sdk", "google_sdk", "Emulator",
    "goldfish", "ranchu", "Andy", "Genymotion",
    "BlueStacks", "nox", "ttVM_Hdragon",
}

# Root detection indicator strings
ROOT_INDICATORS = {
    "/system/app/Superuser.apk",
    "/system/xbin/su",
    "/system/bin/su",
    "com.noshufou.android.su",
    "com.thirdparty.superuser",
    "eu.chainfire.supersu",
    "com.koushikdutta.superuser",
    "com.topjohnwu.magisk",
}

# Standard DEX filename pattern
STANDARD_DEX_PATTERN = re.compile(r"^classes\d*\.dex$")


class APKInconsistencyTestsExtractor(APKExtractor):

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

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

    def _test_zip_bomb(self):
        """Check if any ZIP entry has compression ratio > 100:1."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            with zf:
                for info in zf.infolist():
                    if info.compress_size > 0:
                        ratio = info.file_size / info.compress_size
                        if ratio > 100:
                            return True
            return False
        except Exception as e:
            self.log.warning(f"Error in zip bomb test: {e}")
            return None

    def _test_zip_duplicate_entries(self):
        """Check for duplicate filenames in ZIP directory."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            with zf:
                names = [info.filename for info in zf.infolist()]
                return len(names) != len(set(names))
        except Exception as e:
            self.log.warning(f"Error in duplicate entries test: {e}")
            return None

    def _test_zip_path_traversal(self):
        """Check for path traversal (../) in ZIP entry names."""
        try:
            for f in self._list_files():
                if ".." in f or f.startswith("/"):
                    return True
            return False
        except Exception as e:
            self.log.warning(f"Error in path traversal test: {e}")
            return None

    def _test_zip_suspicious_timestamps(self):
        """Check for timestamps at epoch (1980) or in the future."""
        try:
            zf = self._get_zip_file()
            if not zf:
                return None
            now = datetime.now()
            with zf:
                for info in zf.infolist():
                    try:
                        dt = datetime(*info.date_time)
                        if dt.year <= 1980 or dt > now:
                            return True
                    except (ValueError, TypeError):
                        continue
            return False
        except Exception as e:
            self.log.warning(f"Error in suspicious timestamps test: {e}")
            return None

    def _test_hidden_dex_files(self):
        """Check for DEX files not matching classes*.dex pattern."""
        try:
            for f in self._list_files():
                if f.endswith(".dex"):
                    basename = f.split("/")[-1]
                    if not STANDARD_DEX_PATTERN.match(basename):
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in hidden DEX files test: {e}")
            return None

    def _test_manifest_component_mismatch(self):
        """Check for declared components that don't exist in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            # Get all class names from DEX
            dex_classes = set()
            try:
                from androguard.core.dex import DEX
                for dex_data in (self.apk.get_all_dex() or []):
                    try:
                        d = DEX(dex_data)
                        for cls in d.get_classes():
                            name = cls.get_name()
                            if name:
                                # Convert "Lcom/example/Foo;" to "com.example.Foo"
                                dex_classes.add(
                                    name[1:-1].replace("/", ".") if name.startswith("L") else name
                                )
                    except Exception:
                        continue
            except Exception:
                return None

            if not dex_classes:
                return None

            # Check manifest components against DEX classes
            components = []
            try:
                components.extend(self.apk.get_activities() or [])
                components.extend(self.apk.get_services() or [])
                components.extend(self.apk.get_receivers() or [])
                components.extend(self.apk.get_providers() or [])
            except Exception:
                return None

            for comp in components:
                if comp and comp not in dex_classes:
                    # Component might use a shorthand; check with package prefix
                    package = self.apk.get_package() or ""
                    full_name = package + comp if comp.startswith(".") else comp
                    if full_name not in dex_classes:
                        return True

            return False
        except Exception as e:
            self.log.warning(f"Error in manifest component mismatch test: {e}")
            return None

    def _test_debuggable_release(self):
        """Check android:debuggable=true combined with a release signature."""
        try:
            if not self._is_valid_apk():
                return None

            is_debuggable = self.apk.get_attribute_value(
                "application", "debuggable"
            ) == "true"

            if not is_debuggable:
                return False

            # Check if it has a signing certificate (release builds have certs)
            try:
                certs = self.apk.get_certificates()
                if certs and len(certs) > 0:
                    return True
            except Exception:
                pass

            return False
        except Exception as e:
            self.log.warning(f"Error in debuggable release test: {e}")
            return None

    def _get_dex_strings(self):
        """Get all string constants from DEX files."""
        all_strings = set()
        try:
            from androguard.core.dex import DEX
            for dex_data in (self.apk.get_all_dex() or []):
                try:
                    d = DEX(dex_data)
                    for s in d.get_strings():
                        if s:
                            all_strings.add(s)
                except Exception:
                    continue
        except Exception:
            pass
        return all_strings

    def _test_emulator_detection_strings(self):
        """Check for emulator detection patterns in DEX strings."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            for indicator in EMULATOR_INDICATORS:
                for s in dex_strings:
                    if indicator in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in emulator detection test: {e}")
            return None

    def _test_debugger_detection(self):
        """Check for debugger detection API calls in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            debugger_patterns = {
                "isDebuggerConnected",
                "waitingForDebugger",
                "Debug.isDebuggerConnected",
            }
            for pattern in debugger_patterns:
                for s in dex_strings:
                    if pattern in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in debugger detection test: {e}")
            return None

    def _test_root_detection(self):
        """Check for root detection patterns in DEX."""
        try:
            if not self._is_valid_apk():
                return None

            dex_strings = self._get_dex_strings()
            for indicator in ROOT_INDICATORS:
                for s in dex_strings:
                    if indicator in s:
                        return True
            return False
        except Exception as e:
            self.log.warning(f"Error in root detection test: {e}")
            return None

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        self.test_results = APKInconsistencyTests(
            test_zip_bomb=self._test_zip_bomb(),
            test_zip_duplicate_entries=self._test_zip_duplicate_entries(),
            test_zip_path_traversal=self._test_zip_path_traversal(),
            test_zip_suspicious_timestamps=self._test_zip_suspicious_timestamps(),
            test_hidden_dex_files=self._test_hidden_dex_files(),
            test_manifest_component_mismatch=self._test_manifest_component_mismatch(),
            test_debuggable_release=self._test_debuggable_release(),
            test_emulator_detection_strings=self._test_emulator_detection_strings(),
            test_debugger_detection=self._test_debugger_detection(),
            test_root_detection=self._test_root_detection(),
        )
        return self.test_results

    def _bool_to_nullable(self, val):
        """Convert bool/None to ClickHouse Nullable(UInt8)."""
        if val is None:
            return None
        return int(val)

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

            current_time = datetime.now(timezone.utc)
            t = self.test_results

            data = [[
                self.sha256,
                self._bool_to_nullable(t.test_zip_bomb),
                self._bool_to_nullable(t.test_zip_duplicate_entries),
                self._bool_to_nullable(t.test_zip_path_traversal),
                self._bool_to_nullable(t.test_zip_suspicious_timestamps),
                self._bool_to_nullable(t.test_hidden_dex_files),
                self._bool_to_nullable(t.test_manifest_component_mismatch),
                self._bool_to_nullable(t.test_debuggable_release),
                self._bool_to_nullable(t.test_emulator_detection_strings),
                self._bool_to_nullable(t.test_debugger_detection),
                self._bool_to_nullable(t.test_root_detection),
                current_time,
            ]]

            column_names = [
                'sha256',
                'test_zip_bomb', 'test_zip_duplicate_entries',
                'test_zip_path_traversal', 'test_zip_suspicious_timestamps',
                'test_hidden_dex_files', 'test_manifest_component_mismatch',
                'test_debuggable_release', 'test_emulator_detection_strings',
                'test_debugger_detection', 'test_root_detection',
                'analysis_date',
            ]

            column_type_names = [
                'FixedString(64)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                'Nullable(UInt8)', 'Nullable(UInt8)',
                "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

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