socket(3p)的manpage記錄了這個函式的簽名和關于如何使用它的基本介紹。該檔案的error部分列出了一些errno值,并解釋了錯誤發生的原因。不幸的是,我得到了一個未記錄的錯誤,讀作EPERM,數字1表示操作不允許。這個無記載的errno最初是在ArchLinux環境下被發現的,它使用glibc-2.33和clang-12.0.1。我希望以下的概念驗證(PoC)可以在其他Linux環境中重現:
下面的命令可能有助于再現,PoC代碼存盤在檔案raw-socket-poc.c中:
$ clang -O0 -g raw-socket-poc.c -o raw-socket-poc
$ ./raw-socket-poc; errno $?
EPERM 1 操作不允許
額外的觀察表明,將IPPROTO_TCP改為IPPROTO_UDP沒有任何幫助。然而,將IPROTO_TCP替換為建議的0,程式最終出現了記錄的錯誤EPROTONOSUPPORT 93 Protocol not supported。進一步的實驗發現,以root身份運行原始PoC并沒有出現錯誤。不幸的是,如果PoC以具有CAP_NET_RAW能力的非特權用戶身份運行,就會出現無記載的錯誤。與# setcap CAP_NET_RAW= eip ./raw-socket-poc相關的PoC的能力提升,以及用$ getcap ./raw-socket-poc進行的雙重檢查,其中./raw-socket-poc cap_net_raw=eip顯示。
由于資訊有限,很難對缺乏檔案是有意為之還是設計上的產物做出結論。因此,如果有關于如何使用manpage和原始socket相關功能的解釋,我們可能會很感激。
uj5u.com熱心網友回復:
如果你看一下man 2 socket,在 "ERRORS "部分的底部。你會看到它提到可以生成其他錯誤。
ERRORS
EACCES 創建指定型別和/或pro-tocol的套接字的權限被拒絕。
tocol的套接字的權限被拒絕。
EAFNOSUPPORT
該實作不支持指定的地址族。
種類。
EINVAL 未知的協議,或者協議家族不可用。
EINVAL 型別中的無效標志。
EMFILE 行程檔案表溢位。
ENFILE 系統對開放檔案總數的限制已經達到了
已經達到。
ENOBUFS或ENOMEM
可用的記憶體不足。 在釋放足夠的資源之前,不能創建套接字
直到有足夠的資源被釋放。
不支持協議
該協議型別或指定的協議不支持
在這個域中不支持。
其他錯誤可能是由底層協議模塊產生的。
如果我們再檢查man 7 raw:
SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocol);
...
錯誤
EACCES 用戶試圖在沒有在套接字上設定廣播標志的情況下向一個廣播地址發送。
用戶試圖在套接字上沒有設定廣播標志的情況下向廣播地址發送。
EFAULT 提供了一個無效的記憶體地址。
EINVAL 無效引數。
EMSGSIZE
資料包太大。 要么啟用了路徑MTU發現(the
IP_MTU_DISCOVER套接字標志)或者資料包大小超過了
IPv4資料包的最大允許大小為64 kB。
EOPNOTSUPP
無效的標志被傳遞給一個套接字呼叫(如
MSG_OOB)。)
EPERM 用戶沒有權限打開原始套接字。
只有有效用戶ID為0的行程或
CAP_NET_RAW屬性的行程才可以這樣做。
EPROTO 一個ICMP錯誤已經到達,報告一個引數問題。
我們看到EPERM可以被生成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/311841.html
標籤:
