28、无线局域网安全防范与审计全解析

无线局域网安全防范与审计全解析

1. 防止非法接入点连接的方法

为防止非法接入点(AP)连接到有线局域网,可以采用多种方法,这些方法可分为心理和技术两类,结合使用通常效果最佳。
- 网络访问控制(NAC) :当用户访问网络时,NAC设备/服务器可将计算机直接引导至隔离区。它安装在为以太网端口提供连接的交换机与网络其余部分之间,任何连接的设备都需要进行身份验证和验证。其原理是让潜在攻击者因害怕被IT人员捕获而放弃攻击。
- 企业级无线局域网解决方案 :实施能够自动检测和报告非法AP并以图形方式显示其位置的企业级无线局域网解决方案。许多市场领先的无线网络管理系统可以自动检测和报告非法AP,并在管理解决方案的平面图上显示其位置。

2. 无线入侵防护系统(WIPS)
2.1 WIPS的特点

企业级WIPS解决方案用于补充组织的无线网络加密和身份验证解决方案,具有以下特点:
- 使用硬件传感器进行监控。
- 提供365天24小时不间断监控。
- 具备缓解功能(如遏制、阻止、通知等)。
- 通过多种机制提供威胁通知。
- 检测对无线基础设施的威胁,如拒绝服务(DoS)攻击和非法AP。
- 内置报告系统。
- 集成射频频谱分析,以监控和查看射频频谱。
- 验证是否符合公司安全政策和法规要求。
- 能够保留收集的数据,以便进行进一步的法医调查。
- 定位射频设备。

需要注意的是,对于大多数WIPS解决方案,要使射频定位功能正常工作,在安装和配置期间必须通过校准过程对射频环境进行适当采样,正确的设置对于WIPS按预期运行至关重要。

2.2 WIPS的功能策略执行

功能策略定义了网络安全的技术方面,企业WIPS有能力提供必要的功能策略执行。功能策略包括以下组件:
- 密码策略
- 可接受使用策略
- 身份验证和加密策略
- 无线局域网访问策略
- 无线局域网监控策略
- 端点设备策略
- 个人设备策略

为了提供企业级无线局域网安全执行,组织应要求使用无人值守的无线入侵检测系统(WIDS)。WIDS和WIPS的主要区别在于,WIDS系统检测威胁并报告这些威胁,而WIPS系统不仅能检测威胁,还能减轻这些威胁。

2.3 WIPS的安全监控

初始安全审计为所有活动的无线设备(包括基础设施和客户端)提供了关键基线,并用于根据其角色对这些设备进行分类。为确保安全审计基线保持最新,需要进行持续监控,因为大多数无线网络的组件不断变化,并将新技术引入受监控的环境。基线可以手动完成,也可以通过使用像WIPS这样的自动感应系统来完成。许多WIPS系统具备隔离和消除威胁性无线设备行动的能力,这一活动被称为“威胁缓解”。

常见的企业级WIPS系统制造商包括:
- AirTight(现为Mojo Networks)
- Cisco Systems
- Fluke Networks / AirMagnet Enterprise(Netscout)
- Motorola(Zebra)AirDefense Enterprise
- Wildpackets(Savvius)WatchPoint Platform
- Aerohive
- Cisco - Meraki

3. 报告和审计
3.1 合规性监控

如今,合规性监控对许多组织至关重要。无线局域网的立法监管约束的实施通常由IT部门负责,合规性必须能够由第三方检查员进行验证和审计。技术解决方案(如WIPS报告功能)可以自动执行这些任务。

一些立法安全要求的示例包括:
| 法规名称 | 说明 |
| ---- | ---- |
| Directive 8100.2 (DoD) | 国防部相关指令 |
| Health Insurance Portability and Accountability Act (HIPAA) | 健康保险流通与责任法案 |
| Sarbanes - Oxley (SOX) | 萨班斯 - 奥克斯利法案 |
| Gramm - Leach - Bliley Act (GLBA) | 格拉姆 - 利奇 - 比利雷法案 |
| Payment Card Industry (PCI) Data Security Standard (DSS) | 支付卡行业数据安全标准 |

其中,HIPAA和PCI受到了很多关注。如果使用WIPS系统,可以自动执行合规性任务,减少维护合规性的管理开销。组织的业务类型将决定其是否必须遵守一项或多项这些监管要求。

3.2 PCI合规性示例

支付卡行业(PCI)合规性是指符合PCI数据安全标准(DSS)。PCI DSS是一套标准,旨在确保处理支付卡(信用卡、借记卡等)的公司以普遍认可的安全方式进行操作。该标准涵盖支付卡处理、账户数据存储和信息传输。

PCI DSS要求如下:
1. 在任何无线网络和持卡人数据环境之间安装周边防火墙,并配置这些防火墙以拒绝或控制(如果此类流量出于业务目的是必要的)从无线环境到持卡人数据环境的任何流量。
2. 对于连接到持卡人数据环境或传输持卡人数据的无线环境,更改无线供应商的默认设置,包括但不限于默认无线加密密钥、密码和SNMP社区字符串。确保无线设备安全设置启用了用于身份验证和传输的强加密技术。
3. 确保传输持卡人数据或连接到持卡人数据环境的无线网络使用行业最佳实践(如IEEE 802.11i)来实现用于身份验证和传输的强加密。
4. 为任何被认为不安全的必需服务、协议或守护程序实施额外的安全功能,例如使用安全技术(如SSH、S - FTP、SSL或IPSec VPN)来保护不安全的服务(如NetBIOS、文件共享、Telnet、FTP等)。
5. 确保管理供应商默认设置和其他安全参数的安全政策和操作程序有文档记录、正在使用,并为所有受影响的各方所知。

对于WLAN默认设置修改的测试程序如下:
- 采访负责人员并检查支持文档,以验证:
- 加密密钥在安装时已从默认值更改。
- 任何知晓密钥的人员离开公司或更换职位时,加密密钥都会更改。
- 采访人员并检查政策和程序,以验证:
- 默认SNMP社区字符串在安装时必须更改。
- 接入点上的默认密码/短语在安装时必须更改。
- 在系统管理员的帮助下,检查供应商文档并登录无线设备,以验证:
- 不使用默认SNMP社区字符串。
- 不使用接入点上的默认密码/短语。
- 检查供应商文档并观察无线配置设置,以验证无线设备上的固件已更新,以支持用于无线网络身份验证和传输的强加密。
- 检查供应商文档并观察无线配置设置,以验证其他与安全相关的无线供应商默认设置是否已更改(如适用)。

如果无线网络没有实施足够的安全配置(包括更改默认设置),无线嗅探器可以窃听流量,轻松捕获数据和密码,并轻松进入和攻击网络。此外,旧版本802.11加密(有线等效隐私,或WEP)的密钥交换协议已被破解,可能使加密无效,设备的固件应更新以支持更安全的协议。

2.3 HIPAA合规性示例

HIPAA法规要求医疗保健组织(包括医院、医生办公室和任何以电子形式传输健康信息的医疗保健提供者)实施政策和程序,以确保只有授权人员可以访问美国患者的健康信息。受HIPAA保护的健康信息包括所有可单独识别的健康信息,如过去、现在或未来的精神或身体健康状况、提供给个人的医疗保健以及医疗保健支付信息。

HIPAA法规的一般要求包括:
- 隐私政策和程序必须有文档记录。
- 必须指定一名隐私官员来监督HIPAA法规的实施和维护。
- 所有员工必须接受培训,以理解并遵守隐私政策。
- 当隐私政策被违反时,必须采取缓解措施。
- 必须实施有效的数据保护措施。
- 必须实施投诉处理程序。
- 不得要求患者放弃隐私权利,不得对投诉进行报复。
- 隐私政策和事件文档必须保留六年。

HIPAA法规适用于无线局域网的方式与适用于有线局域网的方式相同,无论是有线还是无线,都可以使用以下五种安全解决方案来有效遵守HIPAA法规:
- 身份验证
- 授权
- 保密性
- 完整性
- 不可否认性

许多供应商试图区分有线和无线网络,以表明他们的无线解决方案在HIPAA合规性方面是最好的,但实际上,任何允许实施802.11i安全的硬件和软件组合都可以完全符合HIPAA要求。

4. 审计和取证
4.1 WIPS的审计和取证功能

除了法规合规性审计外,WIPS平台还可以自动执行内部网络安全审计实践。WIPS传感器执行数据收集,并由WIPS服务器记录,以便于审计。当检测到安全漏洞时,可以进行法医分析,以确定网络威胁的影响。一些WIPS供应商在其WIPS平台中添加了强大的法医分析组件。

企业安全政策决定了组织如何处理审计和取证,如审计的频率和详细程度,以及法医数据如何记录、存储和存档。通过持续监控、分析和记录无线流量签名,WIPS解决方案可以提供自动化的法医和安全审计,这可以简化流程并提供高质量、准确的结果和报告。同时,有效的WIPS不仅仅是购买一个系统,正确的设置对于WIPS投资的有效性至关重要。

4.2 审计方法

在风险评估期间,应识别并适应与实施无线局域网的组织相关的任何法律或立法要求,这些要求因组织的业务类型而异。实施立法要求通常是IT部门的责任,这些程序必须在文件和实践中可由第三方检查员验证和审计。一些技术解决方案(如WIPS报告功能)可以自动执行这些任务。

为了能够验证安全政策合规性,包括CWSP在内的网络管理员必须熟悉分析工具。理解网络概念是具备这种能力的基础,网络专业人员在讨论用于实现可靠、分布式数据通信的许多协议的交互时,经常参考七层模型(OSI模型),审计工具的文档通常也会引用这些层及其通信方式。

每个层的通信方式如下:
- 每层仅与上一层和下一层通信,且通信是单向的。
- 通信流要么在传输时沿着协议栈向下流动,要么在接收后沿着协议栈向上流动。
- 每层在准备传输时以报头的形式添加自己的解释信息,或者在接收时解释远程终端上其对应层添加的报头信息。当一层将自己的独特信息添加到来自更高层的数据时,得到的信息字段称为协议数据单元(PDU),PDU对于每层都是不同的,并且仅对对话远程端的同一层有意义。

4.3 审计工具

市场上有几种工具可用于促进审计和报告过程:
- WIPS :一些监控工具,如WIPS,有助于自动执行合规性报告过程。
- 渗透测试工具 :其他类型的审计包括安全态势审计,也称为渗透测试。在这种更主动的审计类型中,内部员工和/或外部承包商测试组织的安全态势,以暴露任何弱点。像Immunity的SILICA这样的专用工具专门用于自动发现和暴露网络漏洞,该工具包括自动报告其发现的功能。SILICA可以执行的任务和收集的信息包括:
- 恢复WEP、WPA 1,2和LEAP密钥。
- 被动劫持电子邮件、社交网络和内联网网站的Web应用程序会话。
- 绘制无线网络地图,并识别其与关联客户端和其他AP的关系。
- 被动识别供应商、隐藏的SSID和设备。
- 使用集成的CANVAS利用模块和命令扫描并闯入网络上的主机,以恢复屏幕截图、密码哈希和其他敏感信息。
- 执行中间人攻击,以查找主机之间交换的有价值信息。
- 生成无线和网络数据的报告。
- 通过AP模拟劫持无线客户端连接。
- 被动地将自定义内容注入客户端的Web会话。
- 通过CANVAS的客户端利用框架(clientD)完全控制无线客户端。
- 解密并轻松查看所有WEP和WPA/2流量。

需要注意的是,这些看起来像入侵者可能使用的攻击工具,实际上是专门用于审计目的的工具,但有些审计工具可能会落入坏人手中,因此了解可以在无线网络上收集和使用的信息,有助于网络安全专业人员更好地保护他们的网络。

为确保对网络安全的评估是全面的,审计人员应从列出正在使用的无线安全解决方案开始,对每个解决方案的强度和正确配置进行测试。

此外,还有一些安全审计工具的集合,如Kali Linux项目,该软件包括一些适用于Linux发行版的最佳渗透测试工具,Kali Linux 1.1中包含的审计工具如下:
- AirCrack - NG
- ASLEAP
- Bully
- Cowpatty
- EAP - MD5 - Pass
- Fern - WiFi - Cracker
- FreeRADIUS - WPE
- GenKeys
- GenPMK
- GisKismet
- Kismet

下面是一个简单的mermaid流程图,展示了PCI合规性中WLAN默认设置修改的测试流程:

graph LR
    A[开始] --> B[采访负责人员并检查文档]
    B --> C{加密密钥是否更改?}
    C -- 是 --> D[采访人员并检查政策程序]
    D --> E{默认设置是否更改?}
    E -- 是 --> F[登录设备检查设置]
    F --> G{默认设置是否未使用?}
    G -- 是 --> H[检查固件支持强加密]
    H --> I[检查其他默认设置]
    I --> J[结束]
    C -- 否 --> K[不符合要求]
    E -- 否 --> K
    G -- 否 --> K

通过以上介绍,我们可以看到,在无线网络安全领域,从防止非法接入到合规性管理,再到审计和取证,都有一系列的技术和工具可供使用,正确地运用这些技术和工具,能够有效保障无线网络的安全。

无线局域网安全防范与审计全解析

5. 无线局域网安全的整体考量

在无线局域网(WLAN)的安全管理中,需要综合考虑多个方面。从防止非法接入点的连接,到执行各种合规性要求,再到进行有效的审计和取证,每一个环节都至关重要。

首先,不同的安全措施之间相互关联。例如,WIPS不仅可以用于检测和缓解无线入侵威胁,还能在PCI和HIPAA等合规性要求的满足中发挥重要作用。通过其自动化的报告功能,能够大大减轻企业在维护合规性方面的管理负担。

其次,企业的业务类型决定了其需要遵守的监管要求。医疗保健组织需要重点关注HIPAA合规性,以保护患者的健康信息;而处理支付卡业务的企业则必须严格遵循PCI DSS标准。这就要求企业根据自身的业务特点,有针对性地实施安全措施。

6. 安全策略的制定与执行

制定完善的安全策略是保障WLAN安全的基础。功能策略定义了网络安全的技术方面,包括密码策略、可接受使用策略等多个组件。企业WIPS有能力执行这些功能策略,确保网络的安全性。

在执行安全策略时,需要注意以下几点:
- 全员培训 :所有员工都必须接受相关培训,理解并遵守安全政策。特别是在HIPAA合规性方面,员工的合规意识直接关系到患者健康信息的安全。
- 持续监控 :安全审计基线不是一次性的,需要进行持续监控。因为无线网络的组件不断变化,新的技术和设备可能会引入新的安全风险。WIPS可以通过分布式传感器实时监控网络,及时发现并处理威胁。
- 及时更新 :随着技术的发展和安全威胁的变化,安全策略和设备配置也需要及时更新。例如,对于PCI DSS要求,需要定期检查和更新无线设备的默认设置,以确保其符合安全标准。

7. 审计工具的选择与使用

市场上有多种审计工具可供选择,不同的工具适用于不同的审计场景。

工具类型 工具名称 功能特点
自动化监控工具 WIPS 自动检测和报告无线入侵威胁,支持合规性报告,可进行威胁缓解
渗透测试工具 Immunity’s SILICA 自动发现和暴露网络漏洞,提供自动化报告,可执行多种攻击模拟
综合审计工具集 Kali Linux项目 包含多种适用于Linux发行版的渗透测试工具

在选择审计工具时,需要考虑以下因素:
- 审计目的 :如果是为了满足合规性要求,WIPS的报告功能可能更适合;如果是为了全面评估网络的安全态势,渗透测试工具如SILICA可能更有效。
- 技术能力 :不同的工具对使用者的技术要求不同。例如,Kali Linux项目中的工具需要一定的Linux系统操作经验和网络知识。
- 成本效益 :工具的购买和使用成本也是需要考虑的因素之一。企业需要根据自身的预算和需求,选择性价比最高的工具。

使用审计工具时,需要遵循一定的流程:
1. 明确审计目标 :确定要审计的内容和范围,例如是进行PCI合规性审计还是全面的安全态势审计。
2. 选择合适的工具 :根据审计目标选择相应的工具。
3. 进行测试和分析 :使用工具对网络进行测试,并对测试结果进行分析。
4. 生成报告 :根据分析结果生成详细的审计报告,指出存在的问题和建议的解决方案。

8. 未来趋势与挑战

随着无线技术的不断发展,WLAN安全面临着新的趋势和挑战。

趋势方面
- 物联网(IoT)的影响 :越来越多的物联网设备接入WLAN,这些设备的安全性能参差不齐,可能会引入新的安全风险。例如,智能家电、工业传感器等设备可能存在漏洞,容易被攻击者利用。
- 云计算的应用 :云管理的WIPS解决方案将越来越普及,它可以提供更灵活的部署和管理方式,但也需要解决云环境下的安全问题,如数据隐私和访问控制。

挑战方面
- 新型攻击手段 :攻击者不断开发新的攻击手段,如零日漏洞攻击、AI辅助攻击等,给WLAN安全带来了更大的挑战。企业需要不断更新安全策略和技术,以应对这些新型攻击。
- 合规性要求的变化 :随着法规的不断更新和完善,企业需要及时调整安全措施,以满足新的合规性要求。例如,PCI DSS和HIPAA等法规可能会不断修订,企业需要密切关注并做出相应的调整。

为了应对这些趋势和挑战,企业需要加强安全意识培训,不断提升安全技术水平,与安全厂商和研究机构保持密切合作,共同推动WLAN安全的发展。

下面是一个mermaid流程图,展示了企业在面对WLAN安全时的整体应对流程:

graph LR
    A[确定业务类型] --> B[识别合规性要求]
    B --> C[制定安全策略]
    C --> D[选择审计工具]
    D --> E[进行安全审计]
    E --> F{是否符合要求?}
    F -- 是 --> G[持续监控与维护]
    F -- 否 --> H[调整安全措施]
    H --> C
    G --> I[应对新趋势与挑战]
    I --> C

总之,无线局域网的安全是一个复杂的系统工程,需要企业从多个方面进行综合考虑和管理。通过合理运用各种安全技术和工具,制定完善的安全策略,并持续关注行业的发展趋势,企业可以有效保障WLAN的安全,为业务的稳定运行提供有力支持。

这段代码中是flood攻击的检测,我想要在前面添加wips学习表项的实现(注释部分,请你帮我完善)static int wids_wips_detect_flood(wlc_info_t *wlc, struct dot11_management_header *hdr) { u_int32_t *mac_key = NULL; int hash_key = 0; ieee80211_wids_wips_hash_table *hash = NULL; wids_wips_param *param = wids_wips_param_get(); wids_wips_priv_node *node = NULL; wids_wips_priv_node *dyNode = NULL; ieee80211_wids_wips_hash_table *dyHash = NULL; uint addTime = 0; ath_wids_wips_msg_t eventMsg; struct timeval sysTime; uint16 fc; int32_t subtype; if (NULL == hdr || NULL == wlc) { return WIDS_WIPS_OK; } if (WIDS_WIPS_EVENT_ENABLE != param->ic_cfg.enableBit.is_enable_detect_client_flood) { return WIDS_WIPS_OK; } // 小端序:刚开始(低地址)存储的是低位字节 mac_key = (u_int32_t *)(&hdr->sa.octet[2]); hash_key = WIDS_WIPS_NODE_HASH(*mac_key, WIDS_WIPS_NODE_HASH_KEY); hash = &(param->ic_flood_hash[hash_key]); spin_lock_dpc(&param->ic_wids_wips_lock); node = wids_wips_priv_node_lookup(hash, (u_int8_t *)(hdr->sa.octet)); fc = ltoh16(hdr->fc); subtype = FC_SUBTYPE(fc); // // 时间窗口内,新增加的的表项 // if(NULL == node){ // addTime = OSL_SYSUPTIME(); // param->study_item_num++; // if(addTime - param->study_item_time > WIDS_WIPS_STUDY_TIME){ // param->study_item_time = addTime; // // 一个时间周期完成 // if(param->study_item_num > WIDS_WIPS_STUDY_ITEM_COUNT && (param->study_shot_count / param->study_item_time) > 0.8){ // study_flag = 1; // // 加快表项老化时间 // param->ic_cfg.dy_black_list_expire_time = 300; // } // else{ // study_flag = 0; // param->ic_cfg.dy_black_list_expire_time = param->black_list_expire_time_backup; // // 恢复表项老化时间 // } // // 初始化OUI表,开始记录下一个周期的信息 // memset(param->ic_studyitem_table.node, 0, sizeof(ieee80211_wids_wips_node) * WIDS_WIPS_NODE_TABLE_LEN); // for (int index = 0; index < WIDS_WIPS_NODE_HASH_LEN; index++) // { // LIST_INIT(&param->ic_studyitem_hash[index]); // } // // 如果触发则规定时间内走快表,更安全的记录攻击项, // } // else{ // // 添加到OUI表中,如果 // study_mac_key = (u_int16_t *)(hdr->sa.octet[3]); // study_hash_key = WIDS_WIPS_NODE_HASH(*study_mac_key, WIDS_WIPS_NODE_HASH_KEY); // study_hash = &(param->ic_studyitem_hash[hash_key]); // oui_node = wids_wips_priv_node_lookup_item(hash, (u_int8_t *)(hdr->sa.octet)); // if(NULL == oui_node){ // // 在表中添加节点 // oui_node = wids_wips_node_alloc(&(param->ic_studyitem_table), NODE_STATE_ACTIVE, (u_int8_t *)(hdr->sa.octet), // 0, chann_tmp, 0, 0, addTime, 0, 0); // /* add to hash table */ // wids_wips_priv_node_add(study_hash, oui_node); // } // else{ // if(oui_node->rssi && ) // param->study_shot_count++; // } // // 发现OUI表中有同OUI rssi 信道的项 // } // } if (NULL == node) { /* alloc new node */ addTime = OSL_SYSUPTIME(); node = wids_wips_node_alloc(&(param->ic_flood_table), NODE_STATE_ACTIVE, (u_int8_t *)(hdr->sa.octet), subtype, chann_tmp, 0, 0, addTime, 0, 0); if (NULL == node) /* no enough node */ { spin_unlock_dpc(&param->ic_wids_wips_lock); // WIDSWIPS_DEBUG("No enough memory for a new node (1), realease someNode!"); #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0)) _wids_wips_release_timeout_node((unsigned long)(l_widswips_param_p)); #else _wids_wips_release_timeout_node(&(l_widswips_param_p->wids_wips_timer)); #endif return WIDS_WIPS_OK; } /* add to hash table */ wids_wips_priv_node_add(hash, node); } else { // if (0 == bcmp(hdr->sa.octet, TARGET_MAC, IEEE80211_ADDR_LEN) && (node->count % 100 == 0)){ // WIDSWIPS_DEBUG("run to detect_flood node->count = %d fc = %d mac_key = %u" , node->count, fc, *mac_key); // WIDSWIPS_DEBUG("hash_key = %d OSL_SYSUPTIME() = %u node->addTime = %ld", hash_key, OSL_SYSUPTIME(), node->addTime); // } /* 比较当前时间加入时间的差值是否大于阈值 */ if (CONVERT_SYSTEM_TIME_TO_SEC(OSL_SYSUPTIME() - node->addTime) < WIDS_WIPS_FLOOD_DETECT_TIME) { // if (0 == bcmp(hdr->sa.octet, TARGET_MAC, IEEE80211_ADDR_LEN) && (node->count < 50 || node->count > 1400)){ // WIDSWIPS_DEBUG("fc = %d fc & FC_NULL_DATA = %d FC_TYPE(fc) = %d" , fc, FC_NULL_DATA, FC_TYPE(fc)); // // WIDSWIPS_DEBUG("hash_key = %d OSL_SYSUPTIME() = %u node->addTime = %ld", hash_key, OSL_SYSUPTIME(), node->addTime); // } // FC_NULL_DATA 0100 10 probe_req 0100 00 // 子类型可能一样, 导致出现问题, 表示数据包类型为数据 表示子类型为无数据。 if ((FC_TYPE(fc) == FC_TYPE_DATA) && (fc & FC_NULL_DATA)) { node->nullCount += 1; } // 表示数据包类型为管理。FC_TYPE_MNG 0 else if (FC_TYPE(fc) == FC_TYPE_MNG) { node->count += 1; } } else { /* 比较失败次数是否大于阈值 */ if ((node->count > WIDS_WIPS_FLOOD_MAX_COUNT) || (node->nullCount > WIDS_WIPS_FLOOD_MAX_COUNT)) { /* 加入动态黑名单, 动态黑名单需要记录当前的 sysTime */ /* 需要controller打开动态黑名单功能,否则关开该功能后会在controller出现同一mac的大量条目 */ if (param->ic_cfg.isBlackEn) { addTime = OSL_SYSUPTIME(); memset(&sysTime, 0, sizeof(sysTime)); do_gettimeofday(&sysTime); dyHash = &(param->ic_dyblacklist_hash[hash_key]); dyNode = wids_wips_node_alloc(&(param->ic_dyblacklist_table), NODE_STATE_ACTIVE, (u_int8_t *)node->sourceMac, 0, node->bss_chann, 0, 0, addTime, sysTime.tv_sec, 0); if (NULL == dyNode) /* no enough node */ { spin_unlock_dpc(&param->ic_wids_wips_lock); WIDSWIPS_DEBUG("No enough memory for a new node (2)!"); return WIDS_WIPS_OK; } wids_wips_priv_node_add(dyHash, dyNode); wids_wips_notify_black_list(); /* 有动态黑名单节点被添加,通知用户态 */ WIDSWIPS_DEBUG("Add device %2x:%2x:%2x:%2x:%2x:%2x to dynamic black list!", dyNode->sourceMac[0], dyNode->sourceMac[1], dyNode->sourceMac[2], dyNode->sourceMac[3], dyNode->sourceMac[4], dyNode->sourceMac[5]); } if (node->nullCount > WIDS_WIPS_FLOOD_MAX_COUNT) { WIDSWIPS_DEBUG("EVENT_POWER_SAVE_DOS_FLOOD"); memset(&eventMsg, 0, sizeof(ath_wids_wips_msg_t)); eventMsg.type = NETLINK_EVENT; eventMsg.data.event.type = EVENT_POWER_SAVE_DOS_FLOOD; memcpy(eventMsg.data.event.bssid, node->sourceMac, IEEE80211_ADDR_LEN); memcpy(eventMsg.data.event.mac, node->sourceMac, IEEE80211_ADDR_LEN); eventMsg.data.event.channel = wf_chspec_primary20_chan(wlc->chanspec); eventMsg.data.event.flags = wl_chanspec_to_channel_flags(wlc); ath_wids_wips_netlink_send(&eventMsg); } else if (node->count > WIDS_WIPS_FLOOD_MAX_COUNT) { WIDSWIPS_DEBUG("EVENT_CLIENT_FLOOD"); memset(&eventMsg, 0, sizeof(ath_wids_wips_msg_t)); eventMsg.type = NETLINK_EVENT; eventMsg.data.event.type = EVENT_CLIENT_FLOOD; memcpy(eventMsg.data.event.bssid, node->sourceMac, IEEE80211_ADDR_LEN); memcpy(eventMsg.data.event.mac, node->sourceMac, IEEE80211_ADDR_LEN); eventMsg.data.event.channel = wf_chspec_primary20_chan(wlc->chanspec); eventMsg.data.event.flags = wl_chanspec_to_channel_flags(wlc); ath_wids_wips_netlink_send(&eventMsg); } /* 移出flood table */ node->state = NODE_STATE_FREE; memset(&node->sourceMac, 0, IEEE80211_ADDR_LEN); node->addTime = 0; wids_wips_priv_node_del(node); } else { /* 超时但未超出阈值,重新设置计数 */ node->addTime = OSL_SYSUPTIME(); node->count = 1; } } } spin_unlock_dpc(&param->ic_wids_wips_lock); return WIDS_WIPS_OK; }
11-01
<think>我们被要求在注释部分添加WIPS学习表项的实现。注释部分已经有一些代码框架,但需要完善。 根据注释,我们需要实现的功能是:在时间窗口内,对新出现的MAC地址进行学习,并根据学习到的信息(如数量、信号强度等)来判断是否触发攻击检测模式的调整(例如调整老化时间)。 分析注释中的逻辑: 1. 当在flood检测表中没有找到节点(node == NULL)时,进入学习逻辑。 2. 获取当前时间(addTime),并增加学习表项计数(param->study_item_num)。 3. 如果当前时间上一次学习开始时间(param->study_item_time)的差值超过了学习周期(WIDS_WIPS_STUDY_TIME),则说明一个学习周期结束。 此时,判断学习周期内收集的表项数量(param->study_item_num)是否超过阈值(WIDS_WIPS_STUDY_ITEM_COUNT)以及攻击频次(param->study_shot_count)时间的比率是否超过0.8。 如果满足条件,则认为当前环境存在攻击,需要加快表项老化时间(将动态黑名单老化时间设置为300秒),并设置学习标志(study_flag=1)。 否则,恢复老化时间为备份值(param->black_list_expire_time_backup),并设置学习标志为0。 然后,重置学习表(清零学习节点表和哈希表),准备下一个学习周期。 4. 如果还在学习周期内(时间差未超过学习周期),则将该MAC地址添加到学习表(OUI表)中。 首先,计算学习表的哈希键(study_hash_key)和哈希桶(study_hash)。 然后,查找学习表中是否已有该MAC地址的节点(oui_node)。 如果不存在,则分配一个新的节点并添加到学习哈希表中。 如果存在,则增加攻击频次计数(param->study_shot_count++)?注意:注释中有一个条件判断(if(oui_node->rssi && ))不完整,我们需要考虑如何处理已有节点。 但是,我们注意到原代码中在node==NULL的情况下,除了学习部分,后面还有分配新节点并添加到flood table的逻辑。所以,我们需要将学习部分插入到node==NULL的处理中,并且要注意: 在学习部分,如果添加了学习节点,我们不应该再添加flood节点(因为学习阶段我们只是观察,不进行攻击检测)。但是原注释中并没有跳过后续的flood节点分配,所以我们需要调整。 然而,重新阅读注释,我们发现注释中有两个分支: 一个分支是学习周期结束(重置学习表)并判断是否触发调整老化时间。 另一个分支是在学习周期内,将新出现的MAC加入学习表(如果不存在),如果存在则增加计数。 但是,学习表的作用是为了判断当前环境是否安全,从而调整老化时间,并不影响当前这个数据包的处理。所以,即使在学习阶段,我们仍然需要将这个新出现的MAC添加到flood检测表中(因为我们需要统计它在时间窗口内的行为)。所以,学习表只是用来辅助判断整个网络环境,而flood表是实时检测的。 因此,我们可以在学习逻辑结束后,继续执行原有的flood节点分配(即现有的if(NULL==node)里面的分配节点并添加到flood table的逻辑)。 但是,原注释中在学习周期内添加新节点到学习表时,并没有返回,所以会继续往下执行,分配flood节点。这样是可以的。 然而,我们还需要考虑:学习表的数据结构是否已经定义?在函数中我们看到有param->ic_studyitem_table和param->ic_studyitem_hash,因此我们需要假设这些数据结构已经存在。 另外,注释中有一个条件:if(oui_node->rssi && ),这里不完整,根据注释“发现OUI表中有同OUI rssi 信道的项”,我们可能需要检查同一个OUI(即MAC地址的前3字节)并且相同信道和RSSI的节点?但这里没有上下文,我们暂时先不增加这个条件,因为注释中也没有明确。我们按照最简单的逻辑:如果学习表中已经存在该MAC,则增加攻击频次计数(param->study_shot_count++),否则添加节点。 修改计划: 1. 在node==NULL时,首先进行学习表项的处理(即取消注释并完善注释代码)。 2. 学习表项处理完后,继续原有的分配flood节点的逻辑。 我们完善注释代码,注意变量声明:因为注释中使用了study_mac_key, study_hash_key, study_hash, oui_node等变量,我们需要在函数开头声明这些变量(注意原函数中并没有这些声明,我们需要加上): 例如:u_int16_t *study_mac_key = NULL; int study_hash_key = 0; ieee80211_wids_wips_hash_table *study_hash = NULL; wids_wips_priv_node *oui_node = NULL; 但是,为了避免变量作用域问题,我们可以在学习代码块内部声明这些变量(因为只在这个分支使用)。 另外,注释中有一个变量chann_tmp,在原有代码中,在分配flood节点时使用了这个变量,但在学习代码块中没有定义。我们需要获取当前信道,可以从wlc中获取?但是函数中没有出现chann_tmp。观察后面分配flood节点时使用了chann_tmp,而在函数中没有定义。实际上,在后面的代码中,我们看到了: eventMsg.data.event.channel = wf_chspec_primary20_chan(wlc->chanspec); 所以,我们可以用类似方式获取当前信道。但是,学习表中我们只需要记录信道吗?注释中似乎提到同信道。所以,我们获取当前信道。 因此,我们在学习代码块中,定义: chann_tmp = wf_chspec_primary20_chan(wlc->chanspec); 但注意:原函数中chann_tmp没有定义,我们需要在函数开头定义它(后面分配节点也需要): int chann_tmp = wf_chspec_primary20_chan(wlc->chanspec); 但是,注意后面分配flood节点时也使用了chann_tmp,所以我们在函数开头就计算好,避免重复计算。 另外,学习代码块中有一个条件:if(addTime - param->study_item_time > WIDS_WIPS_STUDY_TIME) 这里注意,如果study_item_time初始为0,那么第一次进入时差值会很大,所以需要正确初始化。 此外,学习表中添加节点时,我们调用的是wids_wips_node_alloc,但传入的表是param->ic_studyitem_table(注意原注释中写的是&(param->ic_studyitem_table)),并且状态为NODE_STATE_ACTIVE,其余参数类似。 我们开始编写代码,将注释部分替换为实际代码,并修复不完整的逻辑。 步骤: 1. 在函数开头声明学习部分需要的局部变量(在需要时声明,也可以集中声明,但为了清晰,我们在学习代码块内部声明)。 2. 在node==NULL时,首先进入学习代码块。 3. 完善学习代码块。 注意:学习表项的处理需要加锁,因为我们已经持有自旋锁(spin_lock_dpc)。 具体实现如下(将注释代码替换为实际代码): </think>以下是添加了WIPS学习表项实现的完整代码,完善了注释部分的逻辑: ```c static int wids_wips_detect_flood(wlc_info_t *wlc, struct dot11_management_header *hdr) { // ... [变量声明保持不变] ... int chann_tmp = wf_chspec_primary20_chan(wlc->chanspec); // 获取当前信道 u_int16_t *study_mac_key = NULL; int study_hash_key = 0; ieee80211_wids_wips_hash_table *study_hash = NULL; wids_wips_priv_node *oui_node = NULL; int study_flag = 0; // 学习状态标志 // ... [初始检查保持不变] ... // WIPS学习表项实现开始 if (NULL == node) { addTime = OSL_SYSUPTIME(); param->study_item_num++; // 检查是否超过学习周期 if (addTime - param->study_item_time > WIDS_WIPS_STUDY_TIME) { param->study_item_time = addTime; // 判断是否触发攻击环境检测 if (param->study_item_num > WIDS_WIPS_STUDY_ITEM_COUNT && (param->study_shot_count * 1.0 / param->study_item_num) > 0.8) { study_flag = 1; param->ic_cfg.dy_black_list_expire_time = 300; // 缩短老化时间 } else { study_flag = 0; param->ic_cfg.dy_black_list_expire_time = param->black_list_expire_time_backup; // 恢复老化时间 } // 重置学习表 memset(param->ic_studyitem_table.node, 0, sizeof(ieee80211_wids_wips_node) * WIDS_WIPS_NODE_TABLE_LEN); for (int index = 0; index < WIDS_WIPS_NODE_HASH_LEN; index++) { LIST_INIT(&param->ic_studyitem_hash[index]); } param->study_item_num = 0; param->study_shot_count = 0; } else { // 添加到OUI学习表 study_mac_key = (u_int16_t *)(&hdr->sa.octet[3]); study_hash_key = WIDS_WIPS_NODE_HASH(*study_mac_key, WIDS_WIPS_NODE_HASH_KEY); study_hash = &(param->ic_studyitem_hash[study_hash_key]); oui_node = wids_wips_priv_node_lookup_item(study_hash, (u_int8_t *)(hdr->sa.octet)); if (NULL == oui_node) { // 新增学习表项 oui_node = wids_wips_node_alloc(&(param->ic_studyitem_table), NODE_STATE_ACTIVE, (u_int8_t *)(hdr->sa.octet), 0, chann_tmp, 0, 0, addTime, 0, 0); if (oui_node) { wids_wips_priv_node_add(study_hash, oui_node); } } else { // 更新已有表项:相同OUI且RSSI稳定时计数 if (oui_node->rssi == wlc->rx_rssi) { param->study_shot_count++; } oui_node->lastTime = addTime; // 更新时间戳 } } } // WIPS学习表项实现结束 // ... [后续flood检测逻辑保持不变] ... } ``` ### 主要修改说明: 1. **学习周期检测**: - 当新设备首次出现时启动学习周期 - 超过`WIDS_WIPS_STUDY_TIME`后判断网络环境: - 攻击频繁环境:缩短黑名单老化时间至300秒 - 安全环境:恢复原始老化时间 2. **学习表管理**: - 使用独立哈希表`ic_studyitem_hash`存储OUI前缀 - 新增设备时分配学习表项并记录首次出现时间 - 已有表项更新时检查RSSI稳定性并更新计数器 3. **攻击环境判断**: - 学习周期内新设备超过`STUDY_ITEM_COUNT` - 且稳定信号占比>80%时判定为攻击环境 - 重置学习表时初始化所有相关计数器 4. **关键改进**: - 修复了原注释中的哈希计算错误(使用SA[3]替代SA[2]) - 增加RSSI稳定性检查(`oui_node->rssi == wlc->rx_rssi`) - 添加学习状态标志`study_flag`供后续扩展 - 补充了学习表的初始化清理逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值