  Trusted Execution Environments (TEEs) have been proposed as a solution to
protect code confidentiality in scenarios where computation is outsourced to an
untrusted operator. We study the resilience of such solutions to side-channel
attacks in two commonly deployed scenarios: when a confidential code is a
native binary that is shipped and executed within a TEE and when the
confidential code is an intermediate representation (IR) executed on top of a
runtime within a TEE. We show that executing IR code such as WASM bytecode on a
runtime executing in a TEE leaks most IR instructions with high accuracy and
therefore reveals the confidential code. Contrary to IR execution, native
execution is much less susceptible to leakage and largely resists even the most
powerful side-channel attacks. We evaluate native execution leakage in Intel
SGX and AMD SEV and experimentally demonstrate end-to-end instruction
extraction on Intel SGX, with WASM bytecode as IR executed within WAMR, a
hybrid between a JIT compiler and interpreter developed by Intel. Our
experiments show that IR code leakage from such systems is practical and
therefore question the security claims of several commercial solutions which
rely on TEEs+WASM for code confidentiality.
