[英]Sockets, Unix Domain UDP C++ recvfrom fail to populate the source address
[英]UDP sockets: recvfrom and receive address
BSD / POSIX套接字API recvfrom()
調用(通過<sys/socket.h>
頭文件提供給C或C ++程序員)提供了源地址“ out”參數struct sockaddr *src_addr
,用於存儲IP地址。發送接收到的數據報的遠程服務器。
對於將 UDP數據報發送到某個遠程終結點然后接收響應的任何應用程序(例如DNS解析器),認為始終確保任何接收到的數據報來自同一IP地址是否被視為必要的安全預防措施?作為最后發送的數據報(即上一個sendto
調用中使用的地址?)
換句話說,如果調用sendto
並將數據報發送到某個地址,是否應該始終確保相應的recvfrom
調用來自同一地址 ?
考慮到如果遠程服務器位於防火牆或具有多個IP地址的某些分布式系統的一部分后面,則響應數據報可能合法地源自其他IP,這似乎是不可行的。
但是,如果我們不驗證接收到的數據報與上次sendto
調用的地址來自同一 IP地址,那么如何防止某些攻擊者攔截數據報,然后將惡意數據報發送給客戶端?
您如何知道收到的數據包是答復? 通常,這是使用接收到的數據包中的源地址和端口來完成的。
但是,無法驗證UDP數據包中的源地址。 發件人可以放置他們想要的任何源地址。 因此,僅當您信任所有在Internet上浮動的數據包時,檢查才足夠,這顯然是不可行的。
因此,您需要一些其他機制:隨機cookie,序列號等。
對於將UDP數據報發送到某個遠程終結點然后接收到響應的任何應用程序(例如DNS解析器),
您可以使用隨機的出站端口號。 這就是DNS可以減輕欺騙攻擊的方式 。
是否始終確保任何接收到的數據報與上次發送的數據報來自同一IP地址(即,先前的sendto調用中使用的地址)是否被認為是必要的安全預防措施?
換句話說,如果調用sendto並將數據報發送到某個地址,是否應該始終確保相應的recvfrom調用來自同一地址?
不僅為了安全,而且為了功能。 如果您有多個出站連接,則需要知道與每個連接對應的UDP答復。 這可以通過遠端的IP地址和端口組合來實現。
考慮到如果遠程服務器位於防火牆或具有多個IP地址的某些分布式系統的一部分后面,則響應數據報可能合法地源自其他IP,這似乎是不可行的。
遠程系統應通過與接收答復相同的接口發送答復。 如果不是,它將是“非標准的”,並且不適用於您的應用程序或需要接收和回復UDP數據包的其他應用程序。
但是,如果我們不驗證接收到的數據報與上次sendto調用的地址來自同一IP地址,那么如何防止某些攻擊者攔截數據報,然后將惡意數據報發送給客戶端?
沒有。 如果攻擊者可以MITM UDP連接,則他們可以攔截並更改他們想要的任何內容。 他們可能只是將具有欺騙性IP地址的UDP數據包發送到您的服務。
如果需要保留數據包的完整性和機密性,則需要實施某種加密。 例如。 如果需要支持數據報,請查看DTLS 。
某些NAT支持UDP穿孔,它也可以完全執行您提到的IP驗證,因此無需在應用程序中進行。
對於自定義協議,您可能需要在有效負載中實現某種序列號,以進一步提高安全級別。
在一般情況下,任意接收的數據報不是對先前請求的響應,這是不正確的。 您必須例如通過connect(),
進行篩選,以確保僅處理作為響應的響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.