CXX.SV.PERSISTENT_COOKIE

非法使用永久性 Cookie

当某个应用程序使用永久性 Cookie 而不是会话 Cookie 来跟踪网站上的更改时,Klocwork 会报告 CXX.SV.PERSISTENT_COOKIE 缺陷。

漏洞与风险

永久性 Cookie 会保留在客户端设备上,直到它们被删除或过期。攻击者可以重用来自 Web 应用程序用户的永久性 Cookie,借此冒充他们或劫持他们的会话。Cookie 保存的时间越长,攻击者利用 Cookie 发起攻击的可能性就越高。

缓解与预防

常见的缓解策略是确保在用户会话结束后销毁存储在 Cookie 中的信息,使其无法被重用。会话 Cookie 是实现这一目标的理想工具。会话 Cookie 不会保留任何关于设备的信息,也不会从设备发送信息。当会话过期或因为浏览器窗口关闭而终止时,这些 Cookie 将被删除。

若要减少会话劫持的风险,请确保将 Cookie 创建过程配置为生成会话 Cookie 而不是永久性 Cookie。查看用于生成 Cookie 的框架,了解如何正确生成会话 Cookie。根据所使用的框架,对于为 Cookie 设置到期日期的操作,可能需要设置此操作的失效日期。

漏洞代码示例 1

复制
void create_cookie()
{
    QNetworkCookie cookie;
    cookie.setExpirationDate(QDateTime::currentDateTimeUtc().addSecs(60));  //CXX.SV.PERSISTENT_COOKIE
}

Klocwork 在第 4 行报告了 CXX.SV.PERSISTENT_COOKIE 缺陷,指出使用了永久性 Cookie,因为有效日期已传递到 setExpirationDate() API。

修正代码示例 1

复制
void create_cookie()
{
    QNetworkCookie cookie;
    cookie.setExpirationDate(0);    //no CXX.SV.PERSISTENT_COOKIE as invalid date is passed as argument
}

Klocwork 不再报告 CXX.SV.PERSISTENT_COOKIE 缺陷,因为使用无效日期调用 setExpirationDate() API。在这种情况下,创建了会话 Cookie。如果不存在到期日期,则该 Cookie 被视为“会话 Cookie”,并且将在应用程序退出或会话结束时被丢弃。

扩展

此检查器可进行扩展,方法是在检查器中添加参数,以描述用于为 Cookie 创建库设置到期日期的 API。有关详情,请参阅调整 C/C++ 分析。