diff --git a/src/scheme/user.rs b/src/scheme/user.rs
index bac2a50a8d8abc98f793be95390d9f6f53076416..b62e581ae01995af74cdb26e1250b3eec17661cb 100644
--- a/src/scheme/user.rs
+++ b/src/scheme/user.rs
@@ -350,6 +350,17 @@ impl Scheme for UserScheme {
     }
 
     fn fchown(&self, file: usize, uid: u32, gid: u32) -> Result<usize> {
+        {
+            let contexts = context::contexts();
+            let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
+            let context = context_lock.read();
+            if context.euid != 0 {
+                if uid != context.euid || gid != context.egid {
+                    return Err(Error::new(EPERM));
+                }
+            }
+        }
+
         let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
         inner.call(SYS_FCHOWN, file, uid as usize, gid as usize)
     }