From: Xiaoming Ni <hidden> Date: 2021-03-03 12:56:28
In llcp_sock_connect(), use kmemdup to allocate memory for
"llcp_sock->service_name". The memory is not released in the sock_unlink
label of the subsequent failure branch.
As a result, memory leakage occurs.
fix CVE-2020-25672
Fixes: d646960f7986 ("NFC: Initial LLCP support")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.3
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 2 ++
1 file changed, 2 insertions(+)
From: Xiaoming Ni <hidden> Date: 2021-03-03 12:56:28
When sock_wait_state() returns -EINPROGRESS, "sk->sk_state" is
LLCP_CONNECTING. In this case, llcp_sock_connect() is repeatedly invoked,
nfc_llcp_sock_link() will add sk to local->connecting_sockets twice.
sk->sk_node->next will point to itself, that will make an endless loop
and hang-up the system.
To fix it, check whether sk->sk_state is LLCP_CONNECTING in
llcp_sock_connect() to avoid repeated invoking.
fix CVE-2020-25673
Fixes: b4011239a08e ("NFC: llcp: Fix non blocking sockets connections")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.11
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 4 ++++
1 file changed, 4 insertions(+)
From: Xiaoming Ni <hidden> Date: 2021-03-03 12:56:29
nfc_llcp_local_get() is invoked in llcp_sock_connect(),
but nfc_llcp_local_put() is not invoked in subsequent failure branches.
As a result, refcount leakage occurs.
To fix it, add calling nfc_llcp_local_put().
fix CVE-2020-25671
Fixes: c7aa12252f51 ("NFC: Take a reference on the LLCP local pointer when
creating a socket")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.6
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 2 ++
1 file changed, 2 insertions(+)
From: Xiaoming Ni <hidden> Date: 2021-03-03 12:56:29
nfc_llcp_local_get() is invoked in llcp_sock_bind(),
but nfc_llcp_local_put() is not invoked in subsequent failure branches.
As a result, refcount leakage occurs.
To fix it, add calling nfc_llcp_local_put().
fix CVE-2020-25670
Fixes: c7aa12252f51 ("NFC: Take a reference on the LLCP local pointer when
creating a socket")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.6
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 2 ++
1 file changed, 2 insertions(+)
Hi xiaoming,
the path can only fix the endless loop problem. it can't fix the meaningless llcp_sock->service_name problem.
if we set llcp_sock->service_name to meaningless string, the connect will be failed. and sk->sk_state will not be LLCP_CONNECTED. then we can call llcp_sock_connect() many times. that leaks everything: llcp_sock->dev, llcp_sock->local, llcp_sock->ssap, llcp_sock->service_name...
Regards,
kiyin.
quoted hunk
-----Original Message-----
From: Xiaoming Ni [mailto:nixiaoming@huawei.com]
Sent: Wednesday, March 3, 2021 2:17 PM
To: linux-kernel@vger.kernel.org; kiyin(尹亮) <redacted>;
stable@vger.kernel.org; gregkh@linuxfoundation.org; sameo@linux.intel.com;
linville@tuxdriver.com; davem@davemloft.net; kuba@kernel.org;
mkl@pengutronix.de; stefan@datenfreihafen.org;
matthieu.baerts@tessares.net; netdev@vger.kernel.org
Cc: nixiaoming@huawei.com; wangle6@huawei.com; xiaoqian9@huawei.com
Subject: [PATCH 4/4] nfc: Avoid endless loops caused by repeated
llcp_sock_connect()(Internet mail)
When sock_wait_state() returns -EINPROGRESS, "sk->sk_state" is
LLCP_CONNECTING. In this case, llcp_sock_connect() is repeatedly invoked,
nfc_llcp_sock_link() will add sk to local->connecting_sockets twice.
sk->sk_node->next will point to itself, that will make an endless loop and
hang-up the system.
To fix it, check whether sk->sk_state is LLCP_CONNECTING in
llcp_sock_connect() to avoid repeated invoking.
fix CVE-2020-25673
Fixes: b4011239a08e ("NFC: llcp: Fix non blocking sockets connections")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.11
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index
From: Xiaoming Ni <hidden> Date: 2021-03-05 03:25:07
On 2021/3/3 17:28, kiyin(尹亮) wrote:
Hi xiaoming,
the path can only fix the endless loop problem. it can't fix the meaningless llcp_sock->service_name problem.
if we set llcp_sock->service_name to meaningless string, the connect will be failed. and sk->sk_state will not be LLCP_CONNECTED. then we can call llcp_sock_connect() many times. that leaks everything: llcp_sock->dev, llcp_sock->local, llcp_sock->ssap, llcp_sock->service_name...
I didn't find the code to modify sk->sk_state after a connect failure.
Can you provide guidance?
Based on my understanding of the current code:
After llcp_sock_connect() is invoked using the meaningless service_name
as the parameter, sk->sk_state is set to LLCP_CONNECTING. After that, no
corresponding service responds to the request because the service_name
is meaningless, the value of sk->sk_state remains unchanged.
Therefore, when llcp_sock_connect() is invoked again, resources such as
llcp_sock->service_name are not repeatedly applied because sk_state is
set to LLCP_CONNECTING.
In this way, the repeated invoking of llcp_sock_connect() does not
repeatedly leak resources.
Thanks
Xiaoming Ni
quoted
-----Original Message-----
From: Xiaoming Ni [mailto:nixiaoming@huawei.com]
Sent: Wednesday, March 3, 2021 2:17 PM
To: linux-kernel@vger.kernel.org; kiyin(尹亮) <redacted>;
stable@vger.kernel.org; gregkh@linuxfoundation.org; sameo@linux.intel.com;
linville@tuxdriver.com; davem@davemloft.net; kuba@kernel.org;
mkl@pengutronix.de; stefan@datenfreihafen.org;
matthieu.baerts@tessares.net; netdev@vger.kernel.org
Cc: nixiaoming@huawei.com; wangle6@huawei.com; xiaoqian9@huawei.com
Subject: [PATCH 4/4] nfc: Avoid endless loops caused by repeated
llcp_sock_connect()(Internet mail)
When sock_wait_state() returns -EINPROGRESS, "sk->sk_state" is
LLCP_CONNECTING. In this case, llcp_sock_connect() is repeatedly invoked,
nfc_llcp_sock_link() will add sk to local->connecting_sockets twice.
sk->sk_node->next will point to itself, that will make an endless loop and
hang-up the system.
To fix it, check whether sk->sk_state is LLCP_CONNECTING in
llcp_sock_connect() to avoid repeated invoking.
fix CVE-2020-25673
Fixes: b4011239a08e ("NFC: llcp: Fix non blocking sockets connections")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.11
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index
From: Xiaoming Ni <hidden> Date: 2021-03-25 03:52:08
When sock_wait_state() returns -EINPROGRESS, "sk->sk_state" is
LLCP_CONNECTING. In this case, llcp_sock_connect() is repeatedly invoked,
nfc_llcp_sock_link() will add sk to local->connecting_sockets twice.
sk->sk_node->next will point to itself, that will make an endless loop
and hang-up the system.
To fix it, check whether sk->sk_state is LLCP_CONNECTING in
llcp_sock_connect() to avoid repeated invoking.
Fixes: b4011239a08e ("NFC: llcp: Fix non blocking sockets connections")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.11
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 4 ++++
1 file changed, 4 insertions(+)
From: Xiaoming Ni <hidden> Date: 2021-03-25 03:52:09
nfc_llcp_local_get() is invoked in llcp_sock_connect(),
but nfc_llcp_local_put() is not invoked in subsequent failure branches.
As a result, refcount leakage occurs.
To fix it, add calling nfc_llcp_local_put().
fix CVE-2020-25671
Fixes: c7aa12252f51 ("NFC: Take a reference on the LLCP local pointer when
creating a socket")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.6
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 2 ++
1 file changed, 2 insertions(+)
From: Xiaoming Ni <hidden> Date: 2021-03-25 03:52:09
nfc_llcp_local_get() is invoked in llcp_sock_bind(),
but nfc_llcp_local_put() is not invoked in subsequent failure branches.
As a result, refcount leakage occurs.
To fix it, add calling nfc_llcp_local_put().
fix CVE-2020-25670
Fixes: c7aa12252f51 ("NFC: Take a reference on the LLCP local pointer when
creating a socket")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.6
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 2 ++
1 file changed, 2 insertions(+)
From: Xiaoming Ni <hidden> Date: 2021-03-25 03:52:09
In llcp_sock_connect(), use kmemdup to allocate memory for
"llcp_sock->service_name". The memory is not released in the sock_unlink
label of the subsequent failure branch.
As a result, memory leakage occurs.
fix CVE-2020-25672
Fixes: d646960f7986 ("NFC: Initial LLCP support")
Reported-by: "kiyin(尹亮)" <redacted>
Link: https://www.openwall.com/lists/oss-security/2020/11/01/1
Cc: <redacted> #v3.3
Signed-off-by: Xiaoming Ni <redacted>
---
net/nfc/llcp_sock.c | 2 ++
1 file changed, 2 insertions(+)