題:
告訴用戶哪些輸入字符有效/無效的安全漏洞嗎?
csrowell
2020-01-15 02:41:57 UTC
view on stackexchange narkive permalink

對於在網站上進行輸入驗證,是否存在安全隱患,需要向用戶披露在給定字段中哪些字符有效或無效?

CWE-200:信息暴露說,人們應該盡量不要洩露“可能對攻擊有用但通常對攻擊者不可用的信息”。一個特定的示例將阻止系統公開堆棧跟踪(地址為 CWE-209:通過錯誤消息公開信息)。

是否應該確保錯誤消息是模糊的,例如“您輸入的文本包含無效字符”?

包含用於驗證客戶端代碼(例如JavaScript)的正則表達式的安全漏洞是否對攻擊者可見?另一種方法是在服務器端驗證輸入,這會在某種程度上降低可用性,因為它將需要更多的後端通信(例如,這可能會導致站點響應和顯示錯誤的速度變慢)。

這是否是一種“通過隱蔽性確保安全”的形式,因為用戶/攻擊者可以通過重複提交不同的字符以查看它們是否產生錯誤來推斷哪些字符有效?

讓用戶體驗減慢攻擊速度值得嗎?

據我所知,我應該注意到OWASP的輸入驗證備忘單數據驗證開髮指南沒有提供有關此主題的指導。

編輯2020-01-17:

有幾個問題(包括我為撰寫評論而做出的努力的答案)。 為什麼應該進行任何輸入驗證。

首先,感謝@Loek指出OWASP的應用程序安全驗證標準,該註釋在第21頁和第22頁上提供了有關密碼的指南:“驗證沒有限制密碼的密碼組合規則。允許使用的字符類型。不應要求使用大寫或小寫,數字或特殊字符。”

我認為我們都同意限制密碼中的字符通常不是一個好主意(請參見 @Merchako的答案)。正如 @emory指出的一樣,這可能不是一個硬性規定(例如,我看到許多移動應用使用了更易於使用的輔助“ PIN”來保護應用,即使其他人可以訪問)登錄設備。)當我問這個問題時,我並沒有真正記住密碼,但這是評論和答案的一個方向。 因此,出於這個問題的目的,我們將其視為非密碼字段。

輸入驗證是“深度防禦”的一部分,網站,Web服務和應用程序以防止注入攻擊。 OWASP指出,注入攻擊“可能導致數據丟失,損壞或向未授權方洩露,責任追究或拒絕訪問。注入有時會導致主機完全被接管。業務影響取決於用戶的需求。應用程序和數據。”

有關更多詳細信息,請參閱OWASP的#1漏洞, A1-注入 CWE-20:輸入驗證不正確。請注意,他們倆都說輸入驗證不是完整的防禦措施,而是軟件產品“深度防禦”的一層。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/103507/discussion-on-question-by-csrowell-is-it-a-security-vulnerability-to-tell-a-用戶)。
@RoryAlsop我真的不明白為什麼要轉移到聊天中了-這不像是在這裡進行來回快速對話...。這也弄亂了我對特定評論的鏈接...糟糕的可用性,因為大多數人都不想去單擊鏈接以閱讀對話...。
超過20條評論嚴重破壞了可讀性,並且評論明確不用於討論。聊天是那個地方。如有需要,可以將討論中的所有相關內容併入帖子中。
我認為這就是為什麼他們以低/無票隱藏評論。這並不是默認顯示所有評論。現在您不知道什麼評論很重要或人們是否同意(有些評論獲得40票以上的讚成票)。我找不到在“聊天”中查看這些投票計數的方法。據我所知,他們被消滅了。
那是設計使然。評論僅是臨時性的,可請求或建議對帖子進行改進,或者使其變得清晰。
七 答案:
Steffen Ullrich
2020-01-15 03:02:15 UTC
view on stackexchange narkive permalink

...在攻擊中可能有用,但通常對攻擊者不可用

知道無效的輸入字符很有用,但攻擊者很容易找到只需幾次嘗試。因此,這些信息並不是真正的秘密,讓所有用戶不知道到底出了什麼問題實際上並不能阻止攻擊者,它只會使無辜的用戶遠離,因為他們無法繼續。

IMO這就是問題的全部重點。我同意這個答案,但是如果通過HTTP標頭公開,則服務器版本也會發生同樣的情況。但是,後者屬於CWE的範圍,因為1)輸入字符公開對用戶*有用*且易於發現; 2)服務器軟件版本*沒有可用性/兼容性*效果,同時增加了攻擊面
@usr-local-ΕΨΗΕΛΩΝ:如果有無效字符,攻擊者可以通過嘗試一些無效字符來快速找出哪些無效字符。對於服務器版本,攻擊者無法輕鬆確定版本,除非服務器明確(在標頭中)提供它。因此,提供服務器版本是一個問題,同時提供哪些字符無效。
雖然它本身不是安全漏洞,但是當網站告訴我不要在密碼中使用`,`,反斜杠和`-'時,這立即使他們懷疑是否存在SQL注入問題和/或使用純文本存儲。輸入的信息。
@SeinopSys也可能是深度安全方法。您可以在各處使用參數化查詢,但是如果可以在某些輸入中避免使用典型的SQL注入字符,則也可以禁止使用這些參數。因此,如果有人在開發過程中插入了一個可能的漏洞,則可能會更難利用。
“服務器軟件版本在增加攻擊面的同時沒有可用性/兼容性影響” **這是默默無聞的安全性,它不能阻止任何事情**。與其隱藏服務器版本,不如將其更新為安全版本。說謊/隱藏它並不能阻止該問題,只會使其難於攻擊。
@Vinz243:僅當服務器運行不安全的軟件版本並且管理員知道該版本並且不對其進行修補時,這才是安全性。但是否則,隱藏此類信息只是深度防禦的一部分,即使攻擊者更難獲得有關基礎架構的信息。
Security.SE在隱藏服務器版本方面已經有許多專門的問題:[隱藏版本-有價值還是僅僅是默默無聞的安全性?](https://security.stackexchange.com/q/14709/10843),[正在顯示我在錯誤頁面上運行的服務器上有安全隱患嗎?](https://security.stackexchange.com/q/4940/10843),更普遍地講,[隱晦的有效角色](https://security.stackexchange.com / q / 2430/10843)。
Merchako
2020-01-15 19:42:36 UTC
view on stackexchange narkive permalink

為用戶創建令人沮喪的心理狀況可能會使他們傾向於不太安全的決策。例如,他們嘗試用瑞典語寫密碼,但是您的輸入拒絕了å字符而沒有任何解釋。他們沒有舉起另一個沒有å的好密碼,而是舉起手來並使用 password123 ,這很容易因字典攻擊而失敗。

因此,您曾試圖通過模糊創建一個“更安全”的系統,但是一旦我們考慮了用戶行為,實際上它的安全性就會降低。

有效字符最終可以通過系統方式發現。隱藏它們不值得您對用戶行為造成的損害。


有關更多信息,請參閱“ 安全和認知偏見:探索思維的作用”和“ 使用認知行為來衡量密碼策略的安全影響”Sean Smith等人的基於代理的建模”。

好點子。這裡有人說:“以便利為代價的安全以安全為代價”。
mentallurg
2020-01-15 03:32:36 UTC
view on stackexchange narkive permalink

這要視情況而定。

如果消息從普通用戶的角度描述了一個錯誤,例如“第三個字符必須是數字”,則它不是安全漏洞。但是顯示用於驗證的正則表達式意味著公開實施細節,而可能可能是一個弱點,例如一些庫廣泛使用遞歸調用,而某些表達式可能導致堆棧溢出或占用大量內存和CPU,這可能導致DoS。

CWE-200僅在用戶時才將信息公開定義為弱點。沒有明確授權可以訪問該信息。您正在考慮用戶輸入。意思是,允許用戶 輸入此信息,從而允許他們查看此信息,並且自然而然地,允許他查看與該輸入有關的任何驗證錯誤消息。

堆棧跟踪以及其他技術消息可以提供有關應用程序中使用的技術的信息(例如,使用什麼版本的庫),有關環境的信息(例如,目錄佈局和權限,操作系統類型和版本)等。攻擊者可以利用此信息來有效地選擇針對這些特定技術,庫,操作系統等的漏洞利用程序。這就是為什麼向用戶公開此類信息可能是一個弱點。

不向用戶解釋輸入錯誤的內容肯定是不好的UX,但不是安全性改善。

在相似的情況下,當數據是敏感的並且與之相關的任何驗證可以敏感時,請不要混淆。例如,如果用戶在您希望使用一年的字段中輸入字母,那麼向用戶解釋這種錯誤是安全的。但是,如果用戶輸入電子郵件地址,並且您檢查該地址是否已在系統中註冊,則任何信息(地址已知,地址未知)可能是一個弱點。這就是為什麼當您要實施驗證消息或有關用戶輸入的任何其他反饋時,請評估後果。但是默認情況下,禁止對所有字段進行任何反饋可能會導致用戶體驗不佳,並帶有 false 的安全感。

抱歉,我並不是要建議向用戶顯示RegEx。只是想知道是否應將RegEx嵌入客戶端代碼中。我將修改我的問題以使其更清楚。
@csrowell不要忘記所有顯示在客戶端的內容。即使您沒有在屏幕上顯示它,它也會顯示給惡意類型的用戶(他們肯定會查看他所傳輸的所有客戶端代碼)。
@Thomas:是的,我認為這是OP的重點。在客戶端JS的代碼中使用正則表達式是否安全,可以幫助用戶弄清楚為什麼輸入無效?(因為這將向攻擊者披露規則)。
@PeterCordes我不知道這有什麼用,因為仍然必須在服務器上重複進行檢查(否則惡意用戶可以繞過客戶端檢查來製作不可接受的密碼並提交密碼)。如果您已經在服務器端進行了客戶端檢查(例如,以減少無效嘗試時的服務器負載),那麼隱藏不可接受的字符毫無意義,
@DanM:是的,這個問題的答案是,保持這種模糊不清會損害可用性,而不是幫助保護任何東西。我只是想說明OP的要求,而不是自己問。
Filipe dos Santos
2020-01-15 02:56:49 UTC
view on stackexchange narkive permalink

這只是許多需要權衡利弊以支持系統可用性的情況之一。

但是,顯示堆棧跟踪(差的錯誤處理)和

對於大多數情況,人們可以說,放棄輸入字段中預期或禁止的字符不是 安全漏洞根本沒有其他安全機制,例如限制密碼嘗試。

可以使用威脅建模框架確定這是系統的公認風險。

dandavis
2020-01-15 03:57:37 UTC
view on stackexchange narkive permalink

遮蓋不是安全的。好的系統是安全的,即使攻擊者一無所知。在您的情況下,將浪費的開裂猜測減少一定的百分比(例如25%)不應破壞開裂的實用性:1萬億年與0.75萬億年一樣實用。不保留實施細節也可以幫助新人保衛。

還有社會考慮因素。“警惕”標誌可能會洩露安全實施細節,但同時也會阻止一定規模的常見攻擊。這隻狗幫了大忙,不管是已知的還是未知的,但是一個標誌可以減少圍欄的維護費用,從而可以騰出資源進行其他戰鬥。

“即使攻擊者一無所知,一個好的系統也是安全的。”這種傳統觀點當然是正確的。但是,當您沒有獲得向用戶公開信息的好處時,就不要這樣做。這是因為複雜的系統從根本上不是100%安全的。在這種特定情況下,顯然會帶來巨大的可用性好處,而且絕對不是安全問題,但是在將此邏輯應用於一般情況時需要小心
bolov
2020-01-17 20:49:45 UTC
view on stackexchange narkive permalink

其他答案表明了披露這不是一個安全問題。

我將以一個真正的軼事來論證,不披露可能不僅導致用戶受挫,而且導致安全性降低。

在不明確允許使用哪些字符的網站上,這不止一次發生在我身上。那時我沒有使用密碼生成器,所以我有一個記住密碼的心理計劃。它涉及到使用一些特殊字符,例如 $ @。& 。幾次失敗的嘗試都是我得到的都是“密碼中的無效字符”,然後我逐漸開始消除特殊字符。然後出現“您的密碼不夠安全,請嘗試添加一些數字和符號”……是的,這時我絕對放鬆了。

我終於得到了它來接受我的密碼。它不僅只包含一個特殊字符,而且不適合我的任何用於記住密碼的方案,因此我不得不...嗯...將其存儲在其他位置(這是我什至不知道密碼管理器之前的,所以我會您可以想像我是如何固定它的。我會告訴您它就像一架直升機和一根繩子。

Sango
2020-01-15 18:45:33 UTC
view on stackexchange narkive permalink

在公開用戶可以選擇的字符集方面,我認為沒有問題,只要一方面也要強制執行並檢查這些規則。也就是說,如果不允許用戶在該字段中使用\,則僅在JS輸入中進行此檢查是不夠的,而且在輸入該內容之前(即在DB中以及使用數據時)都無法進行檢查。因此,規則必須始終適用(TOCTOU)。另一部分是,只要仍然給出熵,就可以減少字符集。您可以將“密碼”字符減少為“ a”和“ b”,但隨後必須相應地增加最小密碼長度(並檢查它們是否不僅按住“ a”鍵直到足夠長)。有了足夠長的(隨機)密碼,這也將是一個安全密碼。最後,一個字符全部是位,每個人都知道這是0 & 1,所以(真實)字母始終是已知的,如何有很多可能的安排,由您指定(並檢查)。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...