R. Cameron Craddock

30 papers Journal 30
YearRankTypeTitle / Venue / Authors
2023 J jnl
CoRR
Soichi Hayashi, Bradley Caron, Anibal Sólon Heinsfeld, Sophia Vinci-Booher, Brent C. McPherson, Daniel N. Bullock, Giulia Berto, J. Guiomar Niso, Sandra Hanekamp, Daniel Levitas, Lindsey Kitchell, Josiah Leong, Filipi N. Silva, Serge Koudoro, Hanna Willis, Jasleen Jolly, Derek Pisner, Taylor Zuidema, Jan Kurzwaski, Koulla Mikellidou, Aurore Bussalb, Christopher Rorden, Conner Victory, Dheeraj Bhatia, Dogu Baran Aydogan, Frank C. Yeh, Franco Delogu, Javier Guaje, Jelle Veraart, Jeremy Fischer, Joshua Faskowitz, Maximilien Chaumon, Ricardo Fabrega, David Hunt, Shawn McKee, Shaw T. Brown, Stephanie Heyman, Vittorio Iacovella, Amanda Mejia, Daniele Marinazzo, R. Cameron Craddock, Emanuele Olivetti, Jamie Hanson, Paolo Avesani, Eleftherios Garyfallidis, Daniel Stanzione, James P. Carson, Robert Henschel, David Y. Hancock, Craig A. Stewart, David M. Schnyer, Damian Eke, Russell A. Poldrack, Nathalie George, Holly Bridge, Ilaria Sani, Winrich Freiwald, Aina Puce, Nicholas Port, Franco Pestilli
2022 J jnl
BMC Medical Imaging
Raphael Roger, Melissa A. Hilmes, Jonathan M. Williams, Daniel J. Moore, Alvin C. Powers, R. Cameron Craddock, John Virostko
2021 J jnl
PLoS Comput. Biol.
Eric W. Bridgeford, Shangsi Wang, Zeyi Wang, Ting Xu, R. Cameron Craddock, Jayanta Dey, Gregory Kiar, William R. Gray Roncal, Carlo Colantuoni, Christopher Douville, Stephanie Noble, Carey E. Priebe, Brian Caffo, Michael P. Milham, Xi-Nian Zuo, Joshua T. Vogelstein
2021 J jnl
Frontiers Digit. Health
Congyu Wu, Hagen Fritz, Melissa Miller, R. Cameron Craddock, Kerry A. Kinney, Darla M. Castelli, David M. Schnyer
2021 J jnl
CoRR
Congyu Wu, Hagen Fritz, R. Cameron Craddock, Kerry A. Kinney, Darla M. Castelli, David M. Schnyer
2021 J jnl
NeuroImage
Lei Ai, R. Cameron Craddock, Nim Tottenham, Jonathan P. Dyke, Ryan Lim, Stanley J. Colcombe, Michael P. Milham, Alexandre R. Franco
2021 J jnl
NeuroImage
Amelie Haugg, Fabian M. Renz, Andrew A. Nicholson, Cindy Lor, Sebastian J. Götzendorfer, Ronald Sladky, Stavros Skouras, Amalia McDonald, R. Cameron Craddock, Lydia Hellrung, Matthias Kirschner, Marcus Herdener, Yury Koush, Marina Papoutsi, Nimrod Jakob Keynan, Talma Hendler, Kathrin Cohen Kadosh, Catharina Zich, Simon H. Kohl, Manfred Hallschmid, Jeff MacInnes, R. Alison Adcock, Kathryn C. Dickerson, Nan-kuei Chen, Kymberly D. Young, Jerzy Bodurka, Michael Marxen, Shuxia Yao, Benjamin Becker, Tibor Auer, Renate Schweizer, Gustavo S. P. Pamplona, Ruth A. Lanius, Kirsten Emmert, Sven Haller, Dimitri Van De Ville, Dong-Youl Kim, Jong-Hwan Lee, Theo Marins, Fukuda Megumi, Bettina Sorger, Tabea Kamp, Sook-Lei Liew, Ralf Veit, Maartje S. Spetter, Nikolaus Weiskopf, Frank Scharnowski, David Steyrl
2021 J jnl
NeuroImage
Xindi Wang, Xinhui Li, Jae Wook Cho, Brian E. Russ, Nanditha Rajamani, Alisa Omelchenko, Lei Ai, Annachiara Korchmaros, Stephen J. Sawiak, R. Austin Benn, Pamela Garcia-Saldivar, Zheng Wang, Ned H. Kalin, Charles E. Schroeder, R. Cameron Craddock, Andrew S. Fox, Alan C. Evans, Adam Messinger, Michael P. Milham, Ting Xu
2020 J jnl
CoRR
Congyu Wu, Amanda N. Barczyk, R. Cameron Craddock, Gabriella M. Harari, Edison Thomaz, Jason D. Shumake, Christopher G. Beevers, Samuel D. Gosling, David M. Schnyer
2020 J jnl
CoRR
Congyu Wu, Hagen Fritz, Zoltán Nagy, Juan P. Maestre, Edison Thomaz, Christine Julien, Darla M. Castelli, Kaya de Barbaro, Gabriella M. Harari, R. Cameron Craddock, Kerry A. Kinney, Samuel D. Gosling, David M. Schnyer
2018 J jnl
NeuroImage
Manuel Garcia-Garcia, Aki Nikolaidis, Pierre Bellec, R. Cameron Craddock, Brian Cheung, Francisco X. Castellanos, Michael P. Milham
2018 J jnl
NeuroImage
R. Cameron Craddock, Pierre Bellec, Saâd Jbabdi
2018 J jnl
NeuroImage
Hao-Ting Wang, Danilo Bzdok, Daniel S. Margulies, R. Cameron Craddock, Michael P. Milham, Elizabeth Jefferies, Jonathan Smallwood
2018 J jnl
NeuroImage
Adon F. G. Rosen, David R. Roalf, Kosha Ruparel, Jason Blake, Kevin Seelaus, Lakshmi P. Villa, Rastko Ciric, Philip A. Cook, Christos Davatzikos, Mark A. Elliott, Angel Garcia de La Garza, Efstathios D. Gennatas, Megan Quarmley, J. Eric Schmitt, Russell T. Shinohara, M. Dylan Tisdall, R. Cameron Craddock, Raquel E. Gur, Theodore D. Satterthwaite
2017 J jnl
PLoS Comput. Biol.
Krzysztof J. Gorgolewski, Fidel Alfaro-Almagro, Tibor Auer, Pierre Bellec, Mihai Capota, M. Mallar Chakravarty, Nathan William Churchill, Alexander Li Cohen, R. Cameron Craddock, Gabriel A. Devenyi, Anders Eklund, Oscar Esteban, Guillaume Flandin, Satrajit S. Ghosh, J. Swaroop Guntupalli, Mark Jenkinson, Anisha Keshavan, Gregory Kiar, Franziskus Liem, Pradeep Reddy Raamana, David Raffelt, Christopher John Steele, Pierre-Olivier Quirion, Robert E. Smith, Stephen C. Strother, Gaël Varoquaux, Yida Wang, Tal Yarkoni, Russell A. Poldrack
2017 J jnl
NeuroImage
Alexandre Abraham, Michael P. Milham, Adriana Di Martino, R. Cameron Craddock, Dimitris Samaras, Bertrand Thirion, Gaël Varoquaux
2017 J jnl
NeuroImage
Tamara Vanderwal, Jeffrey Eilbott, Emily S. Finn, R. Cameron Craddock, Adam Turnbull, F. Xavier Castellanos
2017 J jnl
NeuroImage
Franziskus Liem, Gaël Varoquaux, Jana Kynast, Frauke Beyer, Shahrzad Kharabian Masouleh, Julia M. Huntenburg, Leonie Lampe, Mehdi Rahim, Alexandre Abraham, R. Cameron Craddock, Steffi Riedel-Heller, Tobias Luck, Markus Loeffler, Matthias L. Schroeter, Anja Veronica Witte, Arno Villringer, Daniel S. Margulies
2017 J jnl
NeuroImage
Pierre Bellec, Carlton Chu, François Chouinard-Decorte, Yassine Benhajali, Daniel S. Margulies, R. Cameron Craddock
2016 J jnl
NeuroImage
Alexander Opitz, Michael D. Fox, R. Cameron Craddock, Stanley J. Colcombe, Michael P. Milham
2015 J jnl
NeuroImage
Pierre Bellec, Yassine Benhajali, Felix Carbonell, Christian Dansereau, Geneviève Albouy, Maxime Pelland, R. Cameron Craddock, Olivier Collignon, Julien Doyon, Emmanuel Stip, Pierre Orban
2014 J jnl
NeuroImage
Zarrar Shehzad, Clare Kelly, Philip T. Reiss, R. Cameron Craddock, John W. Emerson, Katie McMahon, David A. Copland, F. Xavier Castellanos, Michael P. Milham
2014 J jnl
NeuroImage
Zhen Yang, R. Cameron Craddock, Daniel S. Margulies, Chao-Gan Yan, Michael P. Milham
2014 J jnl
CoRR
Pierre Bellec, Yassine Benhajali, Felix Carbonell, Christian Dansereau, Z. Shehzad, Geneviève Albouy, Maxime Pelland, R. Cameron Craddock, Olivier Collignon, Julien Doyon, Emmanuel Stip, Pierre Orban
2013 J jnl
NeuroImage
Chao-Gan Yan, Brian Cheung, Clare Kelly, Stanley J. Colcombe, R. Cameron Craddock, Adriana Di Martino, Qingyang Li, Xi-Nian Zuo, F. Xavier Castellanos, Michael P. Milham
2013 J jnl
NeuroImage
F. Xavier Castellanos, Adriana Di Martino, R. Cameron Craddock, Ashesh D. Mehta, Michael P. Milham
2013 J jnl
NeuroImage
Gaël Varoquaux, R. Cameron Craddock
2013 J jnl
NeuroImage
R. Cameron Craddock, Michael P. Milham, Stephen LaConte
2013 J jnl
NeuroImage
Chao-Gan Yan, R. Cameron Craddock, Xi-Nian Zuo, Yufeng Zang, Michael P. Milham
2009 J jnl
NeuroImage
George Andrew James, Mary E. Kelley, R. Cameron Craddock, Paul E. Holtzheimer, Boadie W. Dunlop, Charles B. Nemeroff, Helen S. Mayberg, Xiaoping Philip Hu
redb/extractors/apk_extractors/apk_permissions.py
← Index redb/extractors/apk_extractors/apk_permissions.py python
import inspect
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 APKPermissions, APKPermission

# Known dangerous permissions (Android runtime permissions)
DANGEROUS_PERMISSIONS = {
    "android.permission.READ_CALENDAR",
    "android.permission.WRITE_CALENDAR",
    "android.permission.CAMERA",
    "android.permission.READ_CONTACTS",
    "android.permission.WRITE_CONTACTS",
    "android.permission.GET_ACCOUNTS",
    "android.permission.ACCESS_FINE_LOCATION",
    "android.permission.ACCESS_COARSE_LOCATION",
    "android.permission.ACCESS_BACKGROUND_LOCATION",
    "android.permission.RECORD_AUDIO",
    "android.permission.READ_PHONE_STATE",
    "android.permission.READ_PHONE_NUMBERS",
    "android.permission.CALL_PHONE",
    "android.permission.ANSWER_PHONE_CALLS",
    "android.permission.ADD_VOICEMAIL",
    "android.permission.USE_SIP",
    "android.permission.BODY_SENSORS",
    "android.permission.SEND_SMS",
    "android.permission.RECEIVE_SMS",
    "android.permission.READ_SMS",
    "android.permission.RECEIVE_WAP_PUSH",
    "android.permission.RECEIVE_MMS",
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.WRITE_EXTERNAL_STORAGE",
    "android.permission.READ_MEDIA_IMAGES",
    "android.permission.READ_MEDIA_VIDEO",
    "android.permission.READ_MEDIA_AUDIO",
    "android.permission.POST_NOTIFICATIONS",
    "android.permission.NEARBY_WIFI_DEVICES",
    "android.permission.ACTIVITY_RECOGNITION",
    "android.permission.BLUETOOTH_SCAN",
    "android.permission.BLUETOOTH_ADVERTISE",
    "android.permission.BLUETOOTH_CONNECT",
}


class APKPermissionsExtractor(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.permissions_data = None
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    def _get_protection_level(self, perm_name):
        """Determine the protection level of a permission.

        Uses androguard's permission mappings first, falls back to the
        known dangerous list.
        """
        try:
            from androguard.core.api_specific_resources import load_permission_mappings
            target_sdk = self.apk.get_target_sdk_version()
            sdk = int(target_sdk) if target_sdk else 30
            permission_map = load_permission_mappings(sdk)
            if perm_name in permission_map:
                info = permission_map[perm_name]
                if isinstance(info, dict):
                    return info.get("protectionLevel", "unknown")
                return "unknown"
        except Exception:
            pass

        # Fallback to known dangerous set
        if perm_name in DANGEROUS_PERMISSIONS:
            return "dangerous"
        if perm_name.startswith("android.permission."):
            return "normal"
        return "unknown"

    def _compute_permhash(self):
        """Compute permhash using the permhash library."""
        try:
            from permhash.functions import permhash_apk
            return permhash_apk(self.filepath)
        except Exception as e:
            self.log.warning(f"Failed to compute permhash: {e}")
            return None

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK permissions field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

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

        requested_perms = self._safe_extract(
            "requested_permissions",
            lambda: list(self.apk.get_permissions() or []), []
        )
        custom_perms = self._safe_extract(
            "custom_permissions",
            lambda: list(self.apk.get_declared_permissions() or []), []
        )
        custom_perm_set = set(custom_perms)

        permission_details = []
        dangerous_permissions = []

        for perm in requested_perms:
            try:
                protection_level = self._get_protection_level(perm)
                is_custom = perm in custom_perm_set

                permission_details.append(APKPermission(
                    permission_name=perm,
                    protection_level=protection_level,
                    is_custom=is_custom,
                ))

                if protection_level == "dangerous":
                    dangerous_permissions.append(perm)
            except Exception as e:
                self.log.warning(
                    f"Error processing permission '{perm}' for "
                    f"{self.hash.sha256}: {e}"
                )
                permission_details.append(APKPermission(
                    permission_name=perm,
                    protection_level="unknown",
                    is_custom=perm in custom_perm_set,
                ))

        permhash_value = self._compute_permhash()

        self.permissions_data = APKPermissions(
            total_permission_count=len(requested_perms),
            dangerous_permission_count=len(dangerous_permissions),
            permissions=requested_perms,
            dangerous_permissions=dangerous_permissions,
            custom_permissions=custom_perms,
            permission_details=permission_details,
            permhash=permhash_value,
        )
        return self.permissions_data

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

            current_time = datetime.now(timezone.utc)

            # One row per permission
            data = []
            for detail in self.permissions_data.permission_details:
                data.append([
                    self.sha256,
                    detail.permission_name,
                    detail.protection_level,
                    int(detail.is_custom),
                    current_time,
                ])

            if not data:
                return None

            column_names = [
                'sha256', 'permission_name', 'protection_level',
                'is_custom', 'analysis_date',
            ]

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

            return (data, column_names, column_type_names)

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