diff --git a/app.te b/app.te
index f44397763eff767075948c2cdb88d1e29315e980..538c1c453d91075825520e8b56ff8ec2857762c1 100644
--- a/app.te
+++ b/app.te
@@ -84,7 +84,7 @@ allow appdomain qtaguid_device:chr_file r_file_perms;
 
 # Grant GPU access to all processes started by Zygote.
 # They need that to render the standard UI.
-allow appdomain gpu_device:chr_file { rw_file_perms execute };
+allow { appdomain -isolated_app } gpu_device:chr_file { rw_file_perms execute };
 
 # Use the Binder.
 binder_use(appdomain)
diff --git a/isolated_app.te b/isolated_app.te
index 5929b259324bd2d6b6dfe67f0e439eb5b6a9e596..ae4445ab83731de04639b7b36fb99a4facf5afcb 100644
--- a/isolated_app.te
+++ b/isolated_app.te
@@ -13,6 +13,9 @@ type isolated_app, domain;
 app_domain(isolated_app)
 net_domain(isolated_app)
 
+# Isolated apps shouldn't be able to access the driver directly.
+neverallow isolated_app gpu_device:file { rw_file_perms execute };
+
 # read and write access to app_data_file is already
 # granted via app.te. Allow execute.
 # Needed to allow dlopen() from Chrome renderer processes.