diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc
index 65eb073..f1c869f 100644
--- a/mojo/edk/system/core.cc
+++ b/mojo/edk/system/core.cc
@@ -175,6 +175,17 @@
   return h.dispatcher->Close();
 }
 
+MojoResult Core::GetRights(MojoHandle handle,
+                           UserPointer<MojoHandleRights> rights) {
+  Handle h;
+  MojoResult result = GetHandle(handle, &h);
+  if (result != MOJO_RESULT_OK)
+    return result;
+
+  rights.Put(h.rights);
+  return MOJO_RESULT_OK;
+}
+
 MojoResult Core::Wait(MojoHandle handle,
                       MojoHandleSignals signals,
                       MojoDeadline deadline,
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h
index 74c5f47..a97010f 100644
--- a/mojo/edk/system/core.h
+++ b/mojo/edk/system/core.h
@@ -116,6 +116,7 @@
   // This method corresponds to the API function defined in
   // "mojo/public/c/system/handle.h":
   MojoResult Close(MojoHandle handle);
+  MojoResult GetRights(MojoHandle handle, UserPointer<MojoHandleRights> rights);
 
   // These methods correspond to the API functions defined in
   // "mojo/public/c/system/wait.h":
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/edk/system/core_test_base.cc
index 1f982ec..0bddeaa 100644
--- a/mojo/edk/system/core_test_base.cc
+++ b/mojo/edk/system/core_test_base.cc
@@ -208,6 +208,9 @@
 
 // CoreTestBase ----------------------------------------------------------------
 
+// static
+constexpr MojoHandleRights CoreTestBase::kDefaultMockHandleRights;
+
 CoreTestBase::CoreTestBase()
     : platform_support_(embedder::CreateSimplePlatformSupport()) {}
 
diff --git a/mojo/edk/system/core_test_base.h b/mojo/edk/system/core_test_base.h
index a3dd3fd..4dde782 100644
--- a/mojo/edk/system/core_test_base.h
+++ b/mojo/edk/system/core_test_base.h
@@ -32,6 +32,13 @@
  public:
   using MockHandleInfo = CoreTestBase_MockHandleInfo;
 
+  static constexpr MojoHandleRights kDefaultMockHandleRights =
+      MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_TRANSFER |
+      MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE |
+      MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS |
+      MOJO_HANDLE_RIGHT_MAP_READABLE | MOJO_HANDLE_RIGHT_MAP_WRITABLE |
+      MOJO_HANDLE_RIGHT_MAP_EXECUTABLE;
+
   CoreTestBase();
   ~CoreTestBase() override;
 
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc
index 1b3c1fa..745b5af 100644
--- a/mojo/edk/system/core_unittest.cc
+++ b/mojo/edk/system/core_unittest.cc
@@ -44,6 +44,10 @@
   EXPECT_EQ(1u, info.GetCtorCallCount());
   EXPECT_NE(h, MOJO_HANDLE_INVALID);
 
+  MojoHandleRights rights = 0;
+  EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights)));
+  EXPECT_EQ(kDefaultMockHandleRights, rights);
+
   EXPECT_EQ(0u, info.GetWriteMessageCallCount());
   EXPECT_EQ(MOJO_RESULT_OK,
             core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0,
@@ -204,6 +208,17 @@
     EXPECT_EQ(1u, info.GetCloseCallCount());
   }
 
+  // |GetRights()|:
+  {
+    MojoHandleRights rights = 0;
+    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+              core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights)));
+    EXPECT_EQ(0u, rights);
+    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+              core()->GetRights(10, MakeUserPointer(&rights)));
+    EXPECT_EQ(0u, rights);
+  }
+
   // |Wait()|:
   {
     EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
@@ -556,6 +571,16 @@
 TEST_F(CoreTest, InvalidArgumentsDeath) {
   const char kMemoryCheckFailedRegex[] = "Check failed";
 
+  // |GetRights()|:
+  {
+    MockHandleInfo info;
+    MojoHandle h = CreateMockHandle(&info);
+    EXPECT_DEATH_IF_SUPPORTED(core()->GetRights(h, NullUserPointer()),
+                              kMemoryCheckFailedRegex);
+
+    EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
+  }
+
   // |WaitMany()|:
   {
     MojoHandle handle = MOJO_HANDLE_INVALID;
@@ -632,7 +657,7 @@
 //    same/different signals)
 
 TEST_F(CoreTest, MessagePipe) {
-  MojoHandle h[2];
+  MojoHandle h[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
   MojoHandleSignalsState hss[2];
   uint32_t result_index;
 
@@ -644,6 +669,18 @@
   EXPECT_NE(h[1], MOJO_HANDLE_INVALID);
   EXPECT_NE(h[0], h[1]);
 
+  // Both should have the correct rights.
+  static const MojoHandleRights kMessagePipeHandleRights =
+      MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+      MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
+      MOJO_HANDLE_RIGHT_SET_OPTIONS;
+  MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+  EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights)));
+  EXPECT_EQ(kMessagePipeHandleRights, rights);
+  rights = MOJO_HANDLE_RIGHT_NONE;
+  EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights)));
+  EXPECT_EQ(kMessagePipeHandleRights, rights);
+
   // Neither should be readable.
   MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
                                   MOJO_HANDLE_SIGNAL_READABLE};
@@ -976,7 +1013,9 @@
 }
 
 TEST_F(CoreTest, DataPipe) {
-  MojoHandle ph, ch;  // p is for producer and c is for consumer.
+  // p is for producer and c is for consumer.
+  MojoHandle ph = MOJO_HANDLE_INVALID;
+  MojoHandle ch = MOJO_HANDLE_INVALID;
   MojoHandleSignalsState hss;
 
   EXPECT_EQ(MOJO_RESULT_OK,
@@ -987,6 +1026,20 @@
   EXPECT_NE(ch, MOJO_HANDLE_INVALID);
   EXPECT_NE(ph, ch);
 
+  // Both should have the correct rights.
+  static const MojoHandleRights kDataPipeProducerHandleRights =
+      MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE |
+      MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+  static const MojoHandleRights kDataPipeConsumerHandleRights =
+      MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+      MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+  MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+  EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights)));
+  EXPECT_EQ(kDataPipeProducerHandleRights, rights);
+  rights = MOJO_HANDLE_RIGHT_NONE;
+  EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights)));
+  EXPECT_EQ(kDataPipeConsumerHandleRights, rights);
+
   // Producer should be never-readable, but already writable.
   hss = kEmptyMojoHandleSignalsState;
   EXPECT_EQ(
@@ -1681,7 +1734,8 @@
   EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
 }
 
-// TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
+// TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and
+// |MapBuffer()|.
 
 }  // namespace
 }  // namespace system
