~/zara.jpg
Zara Tarkhani
zara@trust: ~

type help, or just scroll ↓

~/publications — hover a title to read its summary, click to keep it open
2026NERVE Attacks: Breaking AI-Powered Brain-Computer InterfacesarXiv

The paper defines NERVE Attacks, five orthogonal attack dimensions spanning AI-powered brain-computer interfaces (BCIs) from physical transport to trained model, and uses its EEGle framework to find 17 novel neuro-specific attacks that threaten users' mental privacy and physical safety.

17novel neuro-specific attacks
3entirely new attack families
99–100%success of invisible backdoor implants
Block diagram of the EEGle framework. A model library (EEGNet, DeepSleepNet, BD-EEGNet) and a BCI context (device config, security policy, hardware metadata) feed the EEGle orchestrator (SEO), which dispatches an Evasion Security Engine (NFA, NRA, TDA, FGSM, PGD), a Backdoor Security Engine, a BCI-system Security Engine (BrainFlow API, BCI stack, OS/firmware/hardware) and a Custom Security Engine. Their results flow to the EEGle Feedback Engine, which loops back to the orchestrator and produces the EEGle output.
EEGle's loop: an orchestrator dispatches evasion, backdoor and system engines; an AI-assisted feedback engine picks the next, so coverage grows at runtime. — Figure 2 from the paper
problem
BCIs route neural signals through headsets, SDKs and AI models to physical devices; consumer stacks lack encryption and authentication, and AI-specific BCI attacks had never been characterised as one threat class.
key idea
Attacks on BCIs must be physiologically plausible, so attackers exploit neuro-specific properties (brain rhythms, event-locked timing, artefact-like waveforms), while generative AI supplies the neuroscience expertise non-experts lack.
how it works
Dimensions cover forged brain signals, timing shifts, replayed epochs, sniffing and spoofing of unencrypted links and sockets ('Vein Tapping'), and artefact-shaped backdoor triggers. EEGle's orchestrator runs evasion, backdoor and system engines; an LLM feedback engine chooses the next plan and synthesises new engines at runtime.
results
  • 17 novel neuro-specific attacks across five dimensions, including three new attack families (neuro-mimetic forgery, temporal desynchronisation, neuro replay) and a ten-trigger backdoor suite.
  • LLM-synthesised brain signals took targeted control of BrainFlow mental-state classifiers within 10 iterations, needing no data from the victim and transferring across subjects and headsets.
  • A sub-second timing shift that injects no data drives EEGNet to chance; a cyclic variant preserves signal power and slips past energy-based anomaly detectors.
  • BCI backdoors show a stealth–effectiveness spectrum absent from image models: high-stealth triggers leave no accuracy footprint, yet six of seven reach 99–100% success.

Read on arXiv →  ·  with G. Akkogiounoglou, L. Qendro, I. Tscherniak, A. Madhavapeddy

2024Machine Learning with Confidential Computing: A Systematization of KnowledgeACM Computing Surveys

This systematisation of knowledge examines how Confidential Computing, using hardware Trusted Execution Environments (TEEs), has been applied to protect machine learning's confidentiality and integrity, why current protection covers only training or inference, and what research could secure the full ML pipeline.

Two-panel diagram. Left, server-side ML (Training or Inference as a Service): data owners and model owners provision data and a model into a TEE on an untrusted server that runs the ML algorithm's inference or training function; alternatively the server owns the model. Right, client-side ML (on-device inference, on-device personalisation, federated learning): model owners provision a model into a TEE on an untrusted client, which feeds it the client's own data.
Server-side versus client-side TEE protection, the split used to classify prior systems: server TEEs guard data and/or models; client TEEs guard the model. — Figure 4 from the paper
problem
ML pipelines span mutually mistrusting parties and complex software stacks, exposing data and models to stealing, inference and poisoning attacks; yet no systematisation of TEE-assisted ML, its obstacles or long-term solutions existed.
key idea
The paper maps the ML pipeline's attack surface onto TEE capabilities, classifying protections by host location (untrusted server or client) and goal (confidentiality or integrity), and pinpoints where TEEs fall short.
how it works
It splits the ML pipeline into stages and attacks into confidentiality (data reconstruction, attribute/membership inference, model stealing) and integrity (poisoning, adversarial examples) classes, compares hardware TEEs and frameworks, and tabulates prior systems by TEE, paradigm, attacks covered and overhead, grouping solutions as whole-in-TEE, partitioned or accelerator-assisted.
results
  • Every existing TEE-for-ML system protects a single stage, training or inference, so none yet secures the full pipeline from data collection to model re-use.
  • Running ML inside a TEE does not by itself stop leakage: access patterns let Privado recover the class labels of encrypted inputs with 97% accuracy on MNIST.
  • TEE limits shape the design space: 128MB of SGX memory and 100–1000× swapping costs push towards partitioned execution and TEE-assisted accelerators such as GPUs.

DOI →  ·  arXiv →  ·  F. Mo, Z. Tarkhani, H. Haddadi

2023Information Flow Tracking for Heterogeneous Compartmentalized Software (Deluminator)RAID

Deluminator is a set of OS abstractions and a userspace framework that track information flows across mixed compartment types (processes, SGX enclaves, TrustZone trusted apps and intra-address-space compartments), so developers can audit policy violations and investigate attacks across these boundaries.

14published TEE vulnerability sets caught
4compartment types, one tracing model
7–29%average overhead
Three-panel architecture diagram. (a) Linux: threads in Process A and Process B, including an in-process compartment C1, use LibDeluminator and shared resources, with the Deluminator Policy management and Tracing System in the OS kernel covering FS/VFS, IPC, virtual memory, network and threads. (b) SGX: Process A and Enclave E, with SGX LibDeluminator in the enclave runtime. (c) TrustZone: normal-world Process A and secure-world TA-1 (with in-TA compartment C2) and TA-2, with tracing systems in both the Linux kernel and the TZ OS. Dashed arrows show flows between threads and shared resources.
Deluminator on Linux, SGX and TrustZone: LibDeluminator runs in processes, enclaves and TAs, while a tracing system in each kernel follows flows across boundaries. — Figure 1 from the paper
problem
Software now mixes process sandboxes, trusted execution environments and in-process compartments, each with its own threat model, yet OS stacks assume single-compartment processes, leaving cross-boundary vulnerabilities hard to detect.
key idea
Model each compartment as labelled system objects (threads, memory regions, files, sockets, pipes, RPCs) and trace flows between them with decentralised information flow control (DIFC) labels, reporting violations rather than enforcing them.
how it works
LibDeluminator's API (d_enable, d_add, d_malloc, plus SLABEL/ILABEL flags on open, socket and pipe) labels objects. A policy management and tracing system in the Linux kernel (29 new Linux Security Module hooks), OP-TEE and the SGX driver/SDK checks flows, including over labelled address-space regions with per-thread page tables.
results
  • Follows data both locally and across the host–TEE boundary, spanning processes, SGX enclaves, TrustZone trusted apps and in-process compartments on Arm and x86-64.
  • Applied to 14 sets of published SGX and TrustZone vulnerabilities (COIN, Boomerang, AsyncShock and others), it surfaced each as a policy violation with only 4–23 changed lines.
  • Gives developers forensics across compartment types at an average 7–29% overhead; enclave-backed Apache httpd costs about 8% on SGX and 10.8% on TrustZone.

DOI →  ·  with A. Madhavapeddy

2023Enabling Lightweight Privilege Separation in Applications with MicroGuardsACNS Workshops · SecMT

MicroGuards is a lightweight Linux kernel abstraction for privilege separation inside a process: each thread can wall off memory regions from untrusted code in the same thread and from other threads, at low cost on mobile and embedded Arm devices.

0.47%httpd cost of isolating TLS keys
83.01%faster than fork
281lines to isolate OpenSSL keys
Architecture diagram. In userspace, Process A contains MicroGuard threads and MicroGuards (MG #a to MG #n) with sharing policies; red dashed accesses from a Compromised Code box are blocked, while dotted safe dataflows link MicroGuards, including read/write sharing with a MicroGuard in Process B. Both processes call the MicroGuard API into the Linux kernel, which holds MicroGuard access control logic, tagged threads and a tagged address space above kernel task and memory management.
Each thread tags its own MicroGuards and sets who may share them; the kernel blocks compromised code in the same process from reaching them. — Figure 1 from the paper
problem
Inside one address space, a compromised thread or unsafe library can read secrets like private keys; existing in-process isolation mostly needs specific languages or x86 features unsuited to mobile and IoT devices.
key idea
Threads become security principals holding kernel-managed labels and capabilities (after decentralised information flow control); each MicroGuard is backed by ordinary page tables or by hardware tagging such as Arm memory domains.
how it works
A Linux Security Module with four custom hooks enforces labels on MicroGuard and POSIX memory calls. Each MicroGuard has a private page table loaded on a lightweight context switch; Arm memory domains and address-space-tagged TLBs limit flushing, and the design anticipates memory-tagging (MTE) and pointer-authentication backends.
results
  • Locking OpenSSL's private keys inside MicroGuards took 281 added lines and cost Apache httpd 0.47% latency (3.67% with one MicroGuard per session).
  • mg_clone creates a protected thread 83.01% faster than fork, so fine-grained separation no longer requires splitting work into processes.
  • One API runs over plain page tables or Arm memory domains, and is designed to adopt Arm memory tagging (MTE) and pointer authentication as backends.

DOI →  ·  with A. Madhavapeddy

2022Secure Programming with Dispersed CompartmentsPhD dissertation · Cambridge

The dissertation introduces dispersed compartments, isolation units whose policies span processes, enclaves and TrustZone trusted apps, and builds Sirius to enforce them on commodity Arm and x86-64 hardware, protecting data shared across these boundaries without having to trust the host kernel.

92%of TEE apps studied had such flaws
16%faster TrustZone stack than OP-TEE
≈11×faster than encrypted filesystems
Layered diagram of Sirius on Arm. Left, the host environment: at EL0 a regular app and a Sirius app holding compartments C_a#1 to C_a#n and Enclave1 over the Sirius API; at EL1 the Sirius Kernel Local Monitor over drivers, network, FS, IPC/RPC, virtual memory and thread management. Right, the TEE environment: at SEL0 Enclave #2 and Enclave #1 holding compartments C_e#1 to C_e#m; at SEL1 the Sirius Enclave Local Monitor. Bottom, at EL3 in modified ARM-TF, the Sirius Security Monitor (SSM) with RPC and helper SMC calls, labels/capabilities, shadow page tables, DIFC verifier, instruction emulator and kernel monitor, linked to both local monitors.
Sirius on Arm: compartments in host apps and enclaves are checked by local monitors in each kernel, with the firmware-level security monitor enforcing policy. — Figure 4.3 from the paper
problem
Processes, sandboxes and trusted execution environments (TEEs) each have their own threat model; existing compartmentalisation cannot extend or monitor compartments beyond one privilege layer or address space, leaving cross-compartment sharing exposed.
key idea
A dispersed compartment groups threads and system objects from different address spaces under dynamic, mutually distrustful policies; dispersed monitoring checks them in each kernel and dispersed enforcement upholds them system-wide.
how it works
Chapter 3 adds three hardware-assisted abstractions: virtual address space objects (VAOs) for intra-address-space isolation, labelled cross-boundary channels and a security monitor (SSM). Chapter 4 builds Sirius: Linux and TEE-kernel monitors check information-flow labels; the SSM, in Arm Trusted Firmware, enforces them. Chapter 5 adds the userspace API and case studies.
results
  • A study of 41 TrustZone and SGX applications found 92% exposed to vulnerabilities through memory, thread or IPC/RPC objects, the case for dispersed compartments.
  • Sirius enforces one policy across host apps and enclaves without trusting the host kernel, anchored by a security monitor in Arm Trusted Firmware.
  • Sirius's TrustZone stack runs 16% faster than OP-TEE and protects files ≈11× faster than encrypted Linux filesystems; hardening httpd took ≈400 lines.

Repository →  ·  advised by A. Madhavapeddy and J. Crowcroft

2022Enhancing the Security & Privacy of Wearable Brain-Computer Interfaces (Argus)arXiv

The paper analyses whole-system threats to commodity wearable brain-computer interfaces (Muse, NeuroSky, OpenBCI), where attacks can leak brainwave data or hijack BCI-controlled devices, and introduces Argus, an information flow control system that tracks and restricts sensitive dataflows.

300+vulnerabilities in commodity BCI stacks
6/6attack vectors stopped by Argus
70%→0%EEG accuracy under adversarial attack
Diagram of a BCI host device: a BCI app (IO and control, signal processing, ML inference, libraries) and its storage of secret data and ML models sit in userspace above the OS kernel, drivers and hardware. Red dashed attack paths run from an adversary process to these components, to another process, through privilege escalation to the kernel, to the Bluetooth link with the BCI headset, and to BCI-controlled devices such as games, robots, drones, a prosthetic arm and a wheelchair.
BCI attack surface: adversaries target the headset link, app components, stored data and ML models to steal secrets or seize BCI-controlled devices. — Figure 1 from the paper
problem
Wearable BCIs pair a head-mounted electroencephalography (EEG) sensor with a phone or Raspberry Pi running ML inference, yet use unencrypted Bluetooth, weak isolation and poor privilege management; prior work offered no defence.
key idea
Model each attack vector, system-side or adversarial-ML, as flows between labelled system objects (threads, memory regions, files, sockets, pipes), then enforce secrecy and integrity policies on them in the kernel.
how it works
A userspace library, LibArgus, lets developers label threads, files, sockets, pipes and memory regions for secrecy or integrity via new and modified syscalls; a kernel tracing and policy management system (TPMS) checks flows through hooks in the virtual file system, sockets and mmap, using ARM memory domains for tainted memory.
results
  • Proof-of-concept attacks on Muse, NeuroSky and OpenBCI headsets uncovered more than 300 vulnerabilities across six attack vectors, from leaking brainwave data to seizing BCI-controlled devices.
  • Exploiting BrainFlow bugs through the root-privileged OpenBCI interface gave arbitrary code execution as root; adversarial EEG inputs cut model accuracy from 70% to 0%.
  • Argus, the first information-flow control system for wearable BCIs and the first to cover both system and adversarial-ML attacks, stopped all six vectors at 12–14% slowdown.

Read on arXiv →  ·  with L. Qendro, M. O'Connor Brown, O. Hill, C. Mascolo, A. Madhavapeddy

2021Enclaves in the Clouds: Legal considerations and broader implicationsCommunications of the ACM

This cross-disciplinary article examines how trusted execution environments (TEEs) bear on cloud organisations' legal obligations under the EU's General Data Protection Regulation (GDPR): they can aid risk management but will not resolve compliance, and many of their benefits fall to providers.

Feature matrix of prominent TEEs: TPM/vTPM (multiple targets), Intel TXT and Intel SGX (x86_64), ARM TrustZone (ARM), Sanctum/KeyStone/MultiZone (RISC-V) and AMD SEV (AMD x86). Filled, half-filled or dash markers show whether each provides, partially supports or lacks in-enclave protection, remote attestation, sealing, secure boot, isolated peripherals, side-channel resistance and open-source hardware.
Purported features of prominent TEEs: most offer in-enclave protection and attestation, side-channel resistance is partial at best, and only RISC-V designs have open hardware. — Figure 1 from the paper
problem
Vendors market enclaves as enabling GDPR compliance, yet how far TEEs help with legal obligations in a service-provider context, and whether they reinforce large providers' dominance, had received little consideration.
key idea
The article maps TEE properties — in-enclave protection, remote attestation, sealing — onto GDPR duties of controllers (typically tenants) and processors (typically providers), then asks who actually benefits.
how it works
It surveys the features of prominent TEEs (Figure 1), then works through GDPR's security duties (Art. 32), processor guarantees (Art. 28), encrypted personal data, analytics and machine learning, and attestation-backed data transfer, before weighing provider and tenant liabilities and market concentration.
results
  • Encrypted personal data often remains personal data, so TEEs do not remove GDPR obligations; providers stay responsible even without plaintext or key access.
  • Many benefits fall to providers: enclaves can show a provider was not at fault for a leak and draw risk-averse tenants to the cloud.
  • It warns of a self-reinforcing cycle: TEEs become best practice, dominant providers are best placed to implement them, so consolidation and systemic risk grow.

“TEEs represent yet another security tool (one of many) that can aid risk management.”

Read on ACM Queue →  ·  DOI →  ·  J. Singh, J. Cobbe, D. L. Quoc, Z. Tarkhani

2020Enclave-Aware Compartmentalization and Secure Sharing with SiriusarXiv

Sirius brings decentralised information flow control (DIFC) to TrustZone enclave applications, governing data flows through threads, address spaces, files, sockets and pipes in both the normal and secure worlds, so that mutually distrustful host and enclave compartments can share resources securely.

≈81×faster than OP-TEE secure storage
41TEE applications analysed
≈10.8%overhead for enclave-backed httpd
Panel (a) of Figure 2 with its key: a Sirius-protected Apache httpd. Normal-world httpd threads and an untrusted OpenSSL part call an enclave holding an OpenSSL compartment and a storage compartment through labelled shared memory; system objects (enclave and app resources, shared memory and RPC, files, sockets, pipes) sit above both kernels and the TEE driver, and calls by unauthorised threads are marked as restricted.
Sirius-protected Apache httpd: only authorised threads reach the OpenSSL enclave compartment, shared memory or labelled system objects; unauthorised threads' calls are blocked. — Figure 2 from the paper
problem
TEEs have a one-way isolation model, leaving a semantic gap with the host. Analysing 41 open-source TEE applications, the paper classifies threading, memory and privilege-separation vulnerabilities that compromise sensitive data.
key idea
Treat each thread in either world as a security principal and enforce DIFC labels on kernel objects in both Linux and the TEE kernel, so enforcement is decentralised across the two kernels.
how it works
A Linux security module with 15 hooks and matching OP-TEE monitor and kernel extensions label threads, enclaves, RPCs, files, sockets and pipes. Isolated memory compartments (IMCs) give threads sharing an address space separate memory views, via per-IMC page tables or ARM memory domains; violating threads are killed.
results
  • The first compartmentalisation framework to control dataflows through threads, address spaces, files, sockets and pipes in both TrustZone worlds, replacing ad-hoc host–enclave interactions.
  • An analysis of 41 open-source TEE applications exposed three classes of insecure host–enclave interaction behind real CVEs, which Sirius eliminates or contains.
  • Labelled file protection runs ≈81× faster than OP-TEE's secure storage, and DarkneTZ ported to Sirius outperforms the original OP-TEE version by ≈5.6%.

Read on arXiv →  ·  with A. Madhavapeddy

2020µTiles: Efficient Intra-Process Privilege Enforcement of Memory RegionsarXiv

µTiles is a Linux kernel abstraction for privilege separation inside a process, aimed at IoT devices: threads protect memory regions from each other and from untrusted code, with protection mapped onto ARMv7-A memory domains to keep overhead low.

1.17×faster than mprotect
0.47%httpd cost of isolating TLS keys
7 KBadded to the kernel image
Diagram of three threads above the userspace/kernel line, each using the µTiles API. Thread 1 calls utile_alloc_tag and utile_modify_label, passes capability b+ to Thread 2 with transfer_caps, and creates child Thread 3 with utile_clone. In the kernel, a table per thread lists its µTiles with permissions (for example #18 read-only, #46 execute-only), tags and capabilities; utile_mmap, utile_munmap and utile_mprotect go to a µTiles virtual memory manager that maps onto DACR domains D0 to D15.
Threads share µTiles by passing capabilities (b+ grants access, not control); tags and capabilities live in the kernel, which maps µTiles onto domains D0–D15. — Figure 2 from the paper
problem
Unix-like systems offer no privilege separation inside a process, so untrusted dependencies or a compromised thread can leak private data; Arm memory domains could help but are scarce, coarse and privileged.
key idea
A kernel virtual-memory layer hides the hardware: threads hold secrecy and integrity labels plus capabilities, and only the kernel decides which µTile occupies which of the 16 domains.
how it works
utile_mmap tags a 1MB-aligned region and assigns it a free hardware domain; when all 16 are taken, an LRU cache evicts and later restores µTiles, so they are virtualised. utile_mprotect flips the domain access register where possible, emulating read-, write- or execute-only. A four-hook Linux Security Module checks labels.
results
  • Virtualises Arm's 16 hardware memory domains: when all are taken, an LRU cache evicts and restores µTiles, so a process can hold more isolated regions than the hardware has domains.
  • Permission changes through utile_mprotect run 1.17× faster than mprotect for no-access and read-write, by flipping the domain access register instead of page tables.
  • Isolating OpenSSL private keys from Heartbleed-style leaks took 281 lines and added 0.47% latency to Apache httpd.

Read on arXiv →  ·  with A. Madhavapeddy

2019Snape: The Dark Art of Handling Heterogeneous EnclavesEdgeSys · EuroSys

Snape is an API and composable platform that lets edge applications declare which data and OS services need protecting, then maps those needs onto the device's available hardware security features rather than shielding the whole application inside one large, monolithic trusted computing base (TCB).

20interfaces changed to port to SGX
3klines in the Snape hypervisor
Side-by-side block diagram. Left, 'Traditional Edge Application': source code and ELF binary on a monolithic OS kernel (POSIX ABI, process model) above hardware with an MMU and idle secure extensions. Right, 'Snape-tailored Application with Trusted Hardware': source code plus an application manifest (key store, serial logger, data input), a platform manifest (arm64/TrustZone, x86_64/SGX + VT-x, RISC-V/capabilities), and a library OS whose boot loader, device drivers and CPU & memory map down to secure boot, isolated peripherals and trusted enclaves backed by TrustZone, TPM, IOMMU, SGX and Keystone.
Traditional edge apps sit on a monolithic OS kernel (left); Snape's manifests map library-OS services onto hardware features like TrustZone, SGX or Keystone (right). — Figure 1 from the paper
problem
Edge devices expose varied security hardware, yet systems such as Haven and TrustShadow shield whole applications on large monolithic TCBs, so one breach exposes everything and overheads apply even to unneeded services.
key idea
A declarative trust manifest (.stm file) names only the private data and OS services to protect, and how strongly; Snape maps each to a dedicated enclave and leaves non-sensitive calls untouched.
how it works
A Solo5-based unikernel monitor on Raspberry Pi 3 redirects protected calls to a TrustZone secure-world OS based on OP-TEE. Services run as pure in-enclave components (PIE-U in secure user mode, PIE-K as secure kernel drivers) or as trusted wrappers that encrypt and validate host filesystem and network calls.
results
  • Solo5 unikernels on Raspberry Pi 3 boards use TrustZone through Snape: host OS services are swapped for hardware-assisted ones only where the manifest asks.
  • Isolation becomes a per-service choice: trusted wrappers cost 2.7–4× over Linux but offer weaker security, while pure in-enclave services give stronger isolation at higher cost.
  • The trusted pieces stay small (a 3k-line Snape hypervisor, 1.9K-line trusted wrappers), and porting the filesystem services to Intel SGX touched just 20 interfaces.

ACM DL →  ·  with A. Madhavapeddy, R. Mortier

2017Trustworthy and Portable Emulation Platform for Digital PreservationiPRES

The paper designs an emulation platform that lets libraries and archives give patrons remote access to restricted born-digital material: an Intel Software Guard Extensions (SGX) enclave on the patron's untrusted machine holds the keys and decrypted content, demonstrated with a modified Game Boy emulator.

Architecture diagram split by a dashed line into Institution Server and Client. The server's Authentication & Verification module and encrypted storage (disk image, digital artifact, keys) connect to the client by (1) remote attestation and key exchange with the client's AV enclave and (3) secure file transfer to a remote/local secure file cache in the operating system. On the client, the AV enclave performs (2) local attestation with the trusted emulator, whose untrusted component talks through trusted interfaces to a secure enclave containing the security module and emulator core.
Only the enclaves (verification and emulator) see keys or plaintext; arrows mark remote attestation and key exchange (1), local attestation (2), file transfer (3). — Figure 6 from the paper
problem
Libraries want to let patrons access restricted born-digital material remotely without unauthorised copying, but the patron's machine is untrusted: a compromised OS may steal keys and disk-image contents from a running emulator.
key idea
The emulator is split so only its core and a security module run in an SGX enclave; the server releases keys only after remote attestation confirms a genuine SGX platform.
how it works
A client authentication-and-verification (AV) enclave locally attests the emulator enclave, then runs remote attestation and key exchange with the institution's server. Encrypted ROMs arrive over SSHFS; the enclave decrypts them internally, re-encrypts anything cached locally and seals keys, while GUI and IO stay outside.
results
  • A modified Game Boy emulator runs on the patron's own untrusted machine while ROM contents stay protected: the archive releases keys only to an attested SGX enclave.
  • Encrypted content can be cached on the patron's machine, so archives avoid the latency of running emulation remotely over the internet.
  • Less than 10k lines run inside enclaves, comfortably within SGX's 128MB limit, with keys sealed and local caches re-encrypted.

PDF (iPRES archive) →  ·  with G. Brown, S. Myers

~/talks
~/contact

LinkedIn · GitHub

Outside work I read, travel, play guitar, walk a lot and sometimes paint.

Cambridge, UK · 2026