Ô­´´ | Ripple20£ºTreck TCP/IPЭÒéջ©¶´·ÖÎöÓëÑéÖ¤

Ðû²¼Ê±¼ä 2020-06-30

Ò»¡¢Ç°ÑÔ


¹úÍâÄþ¾²Ñо¿ÈËÔ±ÔÚÓÉTreck¿ª·¢µÄTCP/IPЭÒéÕ»Öз¢ÏÖÁ˶à¸ö©¶´£¬ÕâһϵÁЩ¶´Í³³ÆΪRipple20¡£ÕâЩ©¶´¹ã·º´æÔÚÓÚǶÈëʽºÍÎïÁªÍøÉ豸ÖУ¬Ó°ÏìÁ˶à¸öÐÐÒµÁìÓò£¨°üÂÞÒ½ÁÆ¡¢ÔËÊä¡¢ÄÜÔ´¡¢µçÐÅ¡¢¹¤Òµ¿ØÖÆ¡¢ÁãÊÛºÍÉÌÒµµÈ£©£¬Éæ¼°ÁËÖڶ๩ӦÉÌ£¨°üÂÞHP¡¢Schneider Electric¡¢Intel¡¢Rockwell Automation¡¢Caterpillar¡¢BaxterµÈ£©¡£


ÕâЩ©¶´Ô´ÓÚRipple20µÄ¶à¸öЭÒ飨°üÂÞIPv4¡¢ICMPv4¡¢IPv6¡¢IPv6OverIPv4¡¢TCP¡¢UDP¡¢ARP¡¢DHCP¡¢DNS»òÒÔÌ«ÍøÁ´Â·²ã£©ÔÚ´¦ÖÃÍøÂ籨ÎÄ·¢ËÍʱ´æÔÚȱÏÝ£¬ÆäÖаüÂÞËĸöÑÏÖØ©¶´£¬ËüÃǵÄCVE±àºÅ·Ö±ðΪCVE-2020-11896¡¢CVE-2020-11898¡¢CVE-2020-11910¡¢CVE-2020-11911¡£CVE-2020-11896£¨CVSSÆÀ·Ö10£©¿Éµ¼ÖÂÔ¶³ÌÖ´ÐдúÂ룬CVE-2020-11897£¨CVSSÆÀ·Ö10£©¿Éµ¼ÖÂÔ½½çдÈ룬CVE-2020-11901£¨CVSSÆÀ·Ö9£©¿Éµ¼ÖÂÔ¶³ÌÖ´ÐдúÂ룬CVE-2020-11898£¨CVSSÆÀ·Ö9.1£©¿Éµ¼ÖÂй¶Ãô¸ÐÐÅÏ¢¡£ÆäËü15¸öRipple20©¶´µÄÑÏÖØˮƽ¸÷Ò죬CVSSÆÀ·Ö·Ö±ð´Ó3.1µ½8.2¡£


ÓÉÓÚÎïÁªÍøÉ豸¹©Ó¦Á´µÄÌØÐÔ£¬Â©¶´Ó°ÏìµÄÉ豸Öڶ࣬ӰÏ췶Χ¹ãÇÒÁ¬Ðøʱ¼ä³¤£¬Â©¶´ÐÞ¸´µÄʵʩ½ÏÀ§ÄÑ¡£Òò´Ë£¬¶«É­Æ½Ì¨ADLabµÚһʱ¼ä¶ÔÏà¹Ø©¶´½øÐÐÁË·ÖÎö²¢Ìá³öÁË·À·¶½¨Òé¡£


¶þ¡¢Ð­ÒéÕ»¼ì²â


ÓÉÓÚ½ÓÄÉTreckЭÒéÕ»µÄ³§¼Ò½Ï¶à£¬ÓÐЩ³§¼ÒÊÇÓ²¼þIPºËµÄ·½Ê½ÒýÓÃÁËTreckЭÒéÕ»¡£µ¥´¿Í¨¹ýÉ豸ָÎÆÀ´Ê¶±ð©¶´ÊDz»×ãµÄ£¬ÈçºÎ¼ì²âÄ¿±êÉ豸ÊÇ·ñΪTreckЭÒéÕ»³ÉΪ×ʲúÅŲéµÄÒªº¦£¬Îª´Ë¶«É­Æ½Ì¨ADLabÄþ¾²Ñо¿Ô±¶ÔTreckЭÒéÕ»½øÐÐÁËÉîÈë·ÖÎö£¬²¢¹ûÈ»ÁËTreckЭÒéÕ»Ö¸ÎƼì²âÒªÁì·¢ÏÖ©¶´¡£


TreckЭÒéÕ»×Ô½ç˵ÁËÀàÐÍΪ165(0xa5)µÄICMP°ü£¬²¢Ò»µ©ÊÕµ½165µÄICMP°ü»á»Ø¸´ÀàÐÍΪ166µÄICMP°üÏìÓ¦¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Ê×ÏÈ£¬ÏòÄ¿±ê·¢ËÍ ICMPÇëÇó°ü£¬ÆäÖÐtype=0xa5£¬code=0¡£ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


È»ºó£¬½ÓÊÕÄ¿±ê·µ»ØµÄicmpÏìÓ¦°üÊý¾Ý£¬ÆäÖÐtype =0xa6,code =0£¬ICMP±¨ÎĵÚ9×Ö½ÚºóµÄÁù¸ö×Ö½ÚΪ0x01,0x51,0x35,0x28,0x57,0x32(´ó¶Ë)»ò0x51,0x01,0x28,0x35,0x32,0x57(С¶Ë£©¡£


Âú×ãÉÏÊöµÄÌõ¼þ£¬Ôò±íÃ÷Ä¿±êÉ豸Ϊtreck ЭÒéÕ»¡£ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Èý¡¢·À·¶½¨Òé


1¡¢Ó¦ÓøüÐÂ


¼°Ê±¸üе½Treck TCP/IPЭÒéÕ»Èí¼þµÄ×îÐÂÎȶ¨°æ±¾£¨6.0.1.67»ò¸ü¸ß°æ±¾£©¡£


2. ×èÖ¹Òì³£IPÁ÷Á¿


¿ÉÒÔͨ¹ýÉî¶ÈÊý¾Ý°ü¼ì²éÀ´×èÖ¹ÍøÂç¹¥»÷£¬ÒÔÏÂÊÇ¿ÉÒÔÊʵ±Ó¦ÓÃÓÚÍøÂç»·¾³ÖеĿÉÄÜ»º½â´ëÊ©£¬¹ýÂËÑ¡Ïî°üÂÞ£º


¡ñ Èç¹ûÍøÂç»·¾³²»Ö§³Ö£¬Ôò¹æ·¶»¯»ò¾Ü¾øIP·ÖƬµÄÊý¾Ý°ü£¨IP·ÖƬ£©

¡ñ Èç¹û²»ÐèÒª£¬Çë½ûÓûò×èÖ¹IPËíµÀ£¨IPv6-in-IPv4»òIP-in-IPËíµÀ£©

¡ñ ×èÖ¹IPԴ·ÓɺÍËùÓв»ÔÞ³ÉʹÓÃIPv6µÄ¹¦Ð§£¬ÀýÈç·ÓɱêÍ·

¡ñ Ç¿ÖÆÖ´ÐÐTCP¼ì²é²¢¾Ü¾ø¸ñʽ´íÎóµÄTCPÊý¾Ý°ü

¡ñ ×èֹδʹÓõÄICMP¿ØÖÆÏûÏ¢£¬ÀýÈçMTU¸üк͵ØÖ·ÑÚÂë¸üÐÂ

¡ñ ͨ¹ýÄþ¾²µÄµÝ¹é·þÎñÆ÷»òÓ¦Óòã·À»ðǽ¹æ·¶DNS

¡ñ È·±£ÍøÂç»·¾³ÖÐʹÓõÄÊÇ¿É¿¿µÄOSIµÚ2²ãÉ豸£¨ÒÔÌ«Íø£©

¡ñ ͨ¹ýDHCPÕìÌýµÈ¹¦Ð§ÌṩDHCP / DHCPv6Äþ¾²ÐÔ

¡ñ Èç¹ûδÔÚ½»»»»ù´¡¼Ü¹¹ÖÐʹÓã¬Ôò½ûÓûò×èÖ¹IPv6¶à²¥¡£


ËÄ¡¢Ïà¹Ø¿´·¨½éÉÜ


1¡¢IP·ÖƬ


IP·ÖƬʹµÃÔÚÍøÂçÖз¢ËÍ´óµÄIP°ü³ÉΪ¿ÉÄÜ£¬¼´Ê¹Æä¾Þϸ´óÓÚÍøÂçÌض¨Á´Â·ÖÐÔÊÐíµÄ×î´óÖµ¡£IP·ÖƬ¼¼ÊõÊÇÒ»ÖÖ½«Êý¾Ý°ü·Ö³É¼¸¸ö½ÏСµÄ²¿ÃÅÒÔÖ§³Öͨ¹ýÕâЩÁ´Â·ºÍÍøÂç´«ÊäµÄ¼¼Êõ¡£¸ÃЭÒéÖ§³ÖÔÚ·¢ËͶ˽øÐзÖƬ£¬È»ºóÔÚ½ÓÊն˶ԷÖƬÖØÐÂ×éºÏ¡£ÕâÔÊÐí²îÒìµÄ°üÔÚÍøÂçÖÐÁãÉ¢µØ´«Ê䣬²¢ÔÚÁíÒ»²àÕýÈ·µØÖØÐÂ×é×°¡£


²îÒìµÄ°üʹÓÃIPÍ·Öеıêʶ×ֶΣ¨Identification£©½øÐзÖ×é¡£´Ë±êʶ×Ö¶ÎÃèÊö·ÖƬÊôÓÚÄĸö°ü¡£Í¬Ò»¸ö°üµÄ¶à¸ö·ÖƬµÄIdentificationÊÇÒ»ÑùµÄ¡£IPv4ͨ¹ýFlags¼°Fragment Offset×ֶζԷÖƬ½øÐйÜÀí£¬FlagsÓÉR¡¢DF¡¢MFÈý²¿ÃÅ×é³É£º


¡ñ R£¨Reserve bit£©±£ÁôδÓÃ

¡ñ DF (Don't Fragment) DF =1£º½ûÖ¹·ÖƬ , DF =0£ºÔÊÐí·ÖƬ

¡ñ MF (More Fragment) MF =1£º·Ç×îºóһƬ, MF =0£º×îºóһƬ(»òδ·ÖƬ)


Fragment Offset(13λ)£ºÒ»¸öIP·Ö×é·ÖƬ·â×°Ô­IP·Ö×éÊý¾ÝµÄÏà¶ÔÆ«ÒÆÁ¿, ƬƫÒÆ×Ö¶ÎÒÔ8×Ö½ÚΪµ¥Ôª¡£IP°ü½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


2¡¢IPËíµÀ¼¼Êõ


IPËíµÀÔÊÐíÁ½¸ö¶ÀÁ¢ÍøÂçÖ®¼äµÄÐéÄâµãµ½µãÁ´Â·¡£ËüÊÇͨ¹ý½«°ü£¨¿ÉÒÔÊÇIP°ü£©·â×°ÔÚÁíÒ»¸ö°üÖÐÀ´ÊµÏֵģ¬Ê¹µÃÄÚ²¿°ü¾ßÓÐÓëÍⲿ°ü²îÒìµÄÔ´µØÖ·ºÍÄ¿±êµØÖ·¡£Íⲿ°üµÄÔ´µØÖ·ºÍÄ¿±êµØÖ·ÊÇËíµÀ¶Ëµã£¬ÄÚ²¿°üÖеĵØÖ·ÓÃÓÚËíµÀÁ½¶ËµÄÍøÂç·ÓÉ¡£ËíµÀÈë¿ÚµãÊǽÓÊÕӦͨ¹ýËíµÀת·¢µÄIPÊý¾Ý°üµÄ½Úµã¡£Ëü½«´ËÊý¾Ý°ü·â×°ÔÚÍⲿIPÊý¾Ý°üÖС£µ±Êý¾Ý°üµ½´ïËíµÀ³ö¿Úµãʱ£¬Ëü±»½â·â×°²¢×ª·¢£¬¾ÍºÃÏñËüÊÇÔÚÄ¿±êÍøÂçÖз¢Ë͵ÄͨÀýÊý¾Ý°üÒ»Ñù¡£IP-in-IP°üÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


IPËíµÀ¼¼ÊõÖ÷ÒªÓ¦ÓÃÔÚÐéÄâרÓÃÍø£¨VPN£©¼¼ÊõÖС£Ä¿Ç°Óм¸ÖÖËíµÀЭÒ飬ÆäÖÐ×î¼òµ¥ºÍ×î¹ÅÀϵÄÊÇIP-in-IP£¨IPЭÒé±àºÅ4£©¡£IP-in-IPÊÇÒ»ÖÖIPËíµÀЭÒ飬ÆäÖÐÒ»¸öIP°üͨ¹ýÌí¼ÓÒ»¸öÍⲿIP±¨Í·£¨ÆäÔ´µØÖ·ºÍÄ¿±êµØÖ··Ö±ð¼´ÊÇËíµÀµÄÈë¿ÚµãºÍ³ö¿Úµã£©·â×°ÔÚÁíÒ»¸öIP°üÖС£ÄÚ²¿Êý¾Ý°üδ±»Ð޸ģ¬ÍⲿIPÍ·´ÓÄÚ²¿IPÍ·¸´ÖÆһЩ×ֶΡ£Íⲿ±¨Í·µÄIPЭÒéºÅΪ4¡£IP-in-IP±¨ÎÄʾÀýÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Îå¡¢TreckЭÒéÕ»


1¡¢Ð­ÒéÕ»¸ÅÊö


TreckЭÒéջͨ¹ýtsPacket½á¹¹À´ÃèÊö°ü½á¹¹£¬Í¨¹ýtsUserPacket½á¹¹Ö§³ÖÊý¾Ý°ü·ÖƬ¡£ÕâÁ½¸ö½á¹¹ÌåÔÚtreck/include/trsocket.hÎļþÖнç˵¡£Treck TCP/IPЭÒéÕ»ÖеİüÊý¾ÝÓÉtsPacketµÄ½á¹¹ÌåÏÖ¡£Ã¿¸ö°ü¶¼ÓëÒ»¸öÊý¾Ý»º³åÇøÏà¹ØÁª£¬¸ÃÊý¾Ý»º³åÇøÉú´æ´Ó½Ó¿ÚÇý¶¯·¨Ê½µ½´ïµÄԭʼÊý¾Ý¡£tsPacket½á¹¹»¹Éú´æÁíÒ»¸ö³ÆΪttUserPacketµÄÖØÒª½á¹¹£¬ÒÔ¼°Ö¸ÏòtsSharedData½á¹¹µÄÖ¸Õ룬¸Ã½á¹¹°üÂÞÍøÂçЭÒéÕ»´¦ÖÃÊý¾Ý°üʱËùÐèµÄÐÅÏ¢£¨Ö¸ÏòÌ×½Ó×ֽṹ¡¢src/dstµØÖ·»ò¶Ë¿ÚµÈµÄÖ¸Õ룩¡£½ç˵ÈçÏ£º


struct tsPacket {

ttUserPacket pktUserStruct;

ttSharedDataPtr pktSharedDataPtr;

struct tsPacket * pktChainNextPtr;

struct tsDeviceEntry * pktDeviceEntryPtr;

union anon_union_for_pktPtrUnion pktPtrUnion;

tt32Bit pktTcpXmitTime;

tt16Bit pktUserFlags;

tt16Bit pktFlags;

tt16Bit pktFlags2;

tt16Bit pktMhomeIndex;

tt8Bit pktTunnelCount;

tt8Bit pktIpHdrLen;

tt8Bit pktNetworkLayer;

tt8Bit pktFiller[1];

};


ÕâÊÇ°üÂÞµÄttUserPacket½á¹¹£¨tsUserPacketµÄtypedef£©£¬½ç˵ÈçÏ£º


struct tsUserPacket {

void * pktuLinkNextPtr; // Next tsUserPacket for fragmented data

ttUser8BitPtr pktuLinkDataPtr;

ttPktLen pktuLinkDataLength;

ttPktLen pktuChainDataLength;

int pktuLinkExtraCount;

};


pktuLinkNextPtr £ºÓÃÓÚ¸ú×ÙÊý¾Ý°üÖеķÖƬ¡£´Ë×Ö¶ÎÖ¸ÏòÌåÏÖÏÂÒ»¸ö·ÖƬµÄÁíÒ»¸ötsPacket½á¹¹£¬¸ÃtsPacket»¹Éú´æ¶ÔÏÂÒ»¸ö·ÖƬµÄÒýÓã¬Èç¹û´ËÁ´½ÓÊÇ×îºóÒ»¸ö·ÖƬ£¬»òÕßÊý¾Ýδ±»·ÖƬ£¬Ôò´Ë×ֶν«ÎªNULL¡£


pktuLinkDataPtr£ºÖ¸Ïòµ±Ç°·ÖƬµÄÊý¾Ý»º³åÇø¡£µ±TreckЭÒéÕ»ÔÚ²îÒì½×¶Î´¦ÖÃÊý¾Ý°üʱ£¬Êý¾Ý»º³åÇøÖмòÖ±ÇÐλÖûᷢÉú±ä»¯£¬ÕâÈ¡¾öÓÚµ±Ç°ÕýÔÚ´¦ÖõÄÊý¾Ý°üËùÔÚЭÒé²ã¡£ÀýÈ磬µ±TreckЭÒéÕ»´¦ÖÃÒÔÌ«Íø²ã£¨ÔÚtfEtherRecv()º¯ÊýÖУ©Ê±£¬´Ë×Ö¶ÎÖ¸ÏòÒÔÌ«Íø±¨Í·¡£


pktuLinkDataLength£ºpktuLinkDataPtrÖ¸ÏòµÄÊý¾ÝµÄ¾Þϸ£¬¼´µ¥¸ö·ÖƬµÄ¾Þϸ¡£

pktuChainDataLength£ºÌåÏÖ°üÂÞËùÓзÖƬµÄÊý¾Ý°ü³¤¶È£¬¼´Êý¾Ý°üµÄ×ܾÞϸ¡£ËüֻΪµÚÒ»¸ö·ÖƬÉèÖá£Èç¹ûÊý¾ÝûÓзÖƬ£¬Ôò¼´ÊÇpktuLinkDataLength¡£


2¡¢Ð­ÒéÕ»´¦Öùý³Ì


ЭÒéÕ»ÖеÄÒ»¸ö³£¼ûģʽÊÇÔÚЭÒéÕ»ÖеIJãÖ®¼äÒƶ¯Ê±µ÷ÕûpktuLinkDataPtrÖ¸Õë¡£ÀýÈ磬Èç¹ûÎÒÃǵİüÊÇÒ»¸öICMP»ØÏÔÇëÇó°ü£¨ping£©£¬ËüµÄЭÒéÓÉÈý²ã×é³É£ºEthernet¡¢IPv4¡¢ICMP¡£ÔÚÕâÖÖÇé¿öÏ£¬µ±´¦ÖÃÒÔÌ«Íø²ã£¨ÔÚtfEtherRecv()º¯ÊýÖУ©Ê±£¬pktuLinkDataPtrÖ¸ÏòÒÔÌ«Íø±¨Í·µÄ¿ªÊ¼£¬È»ºóÔÚÒƶ¯µ½ÏÂÒ»²ã֮ǰ£¬Ê¹ÓÃÒÔÏ´úÂë¶ÔÆä½øÐе÷Õû£¬ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÔÚ±¾ÀýÖУ¬0xe£¨Ê®½øÖÆΪ14£©ÊÇÒÔÌ«Íø±¨Í·£¨6£¨dst MAC£©+6£¨src MAC£©+2£¨etherType£©£©µÄ¾Þϸ¡£µ±tfEtherRecv()º¯ÊýÍê³É°ü´¦ÖÃʱ£¬Ëü½«°üת·¢µ½ÏÂÒ»²ã´¦Öá£Ö§³ÖµÄÒÔÌ«ÍøÀàÐÍÓÐARP¡¢IPv4ºÍIPv6¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÔÚʾÀýÖУ¬µ±IPv4²ã½ÓÊÕµ½Êý¾Ý°ü£¨ÔÚº¯ÊýtfIpIncomingPacket()º¯ÊýÖУ©Ê±£¬Ö¸ÕëpktuLinkDataPtrÒѾ­Ö¸ÏòIP±¨Í·¡£´«ÈëÊý¾ÝÓɾßÓÐÏàͬÃüÃûÔ¼¶¨tf*IncomingPacketµÄº¯Êý´¦Öã¬ÆäÖÐ*ÊÇЭÒéÃû¡£¶ÔÓÚICMP°üÀ´Ëµ£¬ËüÓÉÈý²ãЭÒé×é³É£¨Ethernet/IPv4/ICMP£©£¬Êý¾Ý°ü½«Óɺ¯ÊýtfEtherRecv¡¢tfIpIncomingPacketºÍtfIcmpIncomingPacketº¯Êý·Ö±ð´¦Öá£


3¡¢·ÖƬÖØ×é


TreckЭÒéÕ»ÔÚtfIpReassemblePacket()º¯ÊýÖд¦Ö÷ÖƬµÄÖØ×飬¸Ãº¯ÊýÓÉtfIpIncomingPacket()µ÷Óá£Ã¿µ±½ÓÊÕµ½·¢ÍùÉ豸µÄIP·ÖƬʱ£¬¾Í»áµ÷Óô˺¯Êý¡£Èç¹ûȱÉÙ·ÖƬ£¬º¯Êý½«·µ»ØNULL¡£·ñÔò£¬Èç¹ûËùÓзÖƬ¶¼µ½´ï¶øÇÒûÓпն´£¬ÔòÍøÂçЭÒéÕ»½«Ê¹ÓÃpktuLinkNextPtr×ֶν«·ÖƬÁ´½ÓÔÚÒ»Æð£¬È»ºó½«Êý¾Ý°üͨ±¨¸øÏÂÒ»²ã½øÐнøÒ»²½´¦Öá£ÔÚ´ËÉÏÏÂÎÄÖУ¬¡°ÖØ×顱һ´Ê²¢²»Òâζ׎«Êý¾Ý°ü¸´ÖƵ½Á¬ÐøµÄ´æ´¢¿é£¬¶øÖ»ÊǼòµ¥µØ½«ËüÃÇÁ´½Óµ½Ò»¸öÁ´±íÖС£·ÖƬÊý¾ÝÁ´±í½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

4¡¢tfIpIncomingPacketº¯Êý


tfIpIncomingPacket()º¯ÊýÊÇ´¦ÖÃIP°üµÄÖ÷Òªº¯Êý£¬¸Ãº¯ÊýÖ÷ÒªÁ÷³ÌÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


tfIpIncomingPacket()Ê×ÏÈÅжÏÊý¾Ý°üºÏ·¨ÐÔ¡£tfIpIncomingPacket()º¯Êý³ýÁËÑéÖ¤IPͷУÑéºÍ£¬Ëü»¹½øÐÐÒÔÏÂÑéÖ¤£¬ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


È»ºóÈç¹ûËùÓкϷ¨ÐÔ¼ì²é¶¼Í¨¹ý£¬tfIpIncomingPacket()º¯Êý½«¼ì²éIP±¨Í·ÖÐTotalLength ÊÇ·ñÑϸñСÓÚÊý¾Ý°üµÄpktuChainDataLength£¬ÕâÌåÏÖʵ¼Ê½ÓÊÕµÄÊý¾Ý±ÈIP±¨Í·ÖÐÉùÃ÷µÄÊý¾Ý¶à¡£Èç¹ûÊÇÕæµÄ£¬Ôò½øÐÐÐÞ¼ô²Ù×÷£¬ÒªÉ¾³ýÌرðµÄÊý¾Ý£¬ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÔÙÕßÈç¹ûIPÊý¾Ý°üµÄMFΪ1»òÕßFragment Offset´óÓÚ0£¬ÔòtfIpIncomingPacket()º¯Êý¾ÍÒªµ÷ÓÃtfIpReassemblePacket()º¯Êý½øÐзÖƬÖØ×é¡£Èç¹ûIP·ÖƬÊý¾Ý½ÓÊÕ²»ÍêÕû£¬ÔòtfIpReassemblePacket()º¯Êý·µ»ØNULL¡£Èç¹ûËùÓÐIP·ÖƬ¶¼µ½´ï¶øÇÒûÓдíÎó£¬ÔòTreckЭÒéջʹÓÃpktuLinkNextPtr×ֶν«ÕâЩ·ÖƬÁ´½ÓÔÚÒ»Æ𣬽¨Á¢Á´±í£¬²¢½«°üͨ±¨µ½ÏÂÒ»²ã½øÐнøÒ»²½´¦Öã¬ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


×îºóÈç¹ûÒѾ­ÊÕµ½ÍêÕûµÄIPÊý¾Ý°ü£¬ÔòtfIpIncomingPacket()º¯Êýƾ¾ÝIPÊý¾Ý°üÖеÄЭÒé×ֶεÄЭÒéºÅ£¬µ÷ÓÃÏàÓ¦µÄЭÒé°ü´¦Öú¯Êý½øÐд¦Öá£ÔÚÏÂÁдúÂëÖУ¬µ±Ð­ÒéºÅΪUDPʱ£¬Ôòµ÷ÓÃtfUdpIncomingPacket()º¯Êý£¬µ±Êý¾Ý°üЭÒéΪIP-in-IPЭÒ飨ЭÒéºÅ4£©Ê±£¬»áµÝ¹éµ÷ÓÃtfIpIncomingPacket()º¯Êý£¬´úÂëʵÏÖÈçÏÂËùʾ£º



¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Áù¡¢Â©¶´Ô­Àí·ÖÎö


1¡¢CVE-2020-11896


Ç°ÎÄÒѾ­½éÉÜtfIpIncomingPacket()º¯ÊýµÄʵÏÖ¹ý³Ì£¬µÚ¶þ²½µÄÊý¾Ý²Ã¼ôÊÇ©¶´µÄÔ­Òò£¬ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


pktuLinkDataLength±£Áôµ±Ç°·ÖƬµÄ¾Þϸ£¬pktuChainDataLength±£ÁôÕû¸öIPÊý¾Ý°üµÄ¾Þϸ¡£Èç¹ûÖ´ÐÐÉÏÊö²Ù×÷£¬½«µ¼ÖÂÒ»¸ö·×ÆçÖÂÐÔµÄ״̬£¬ÆäÖÐpkt->pktuChainDataLength==pkt->pktuLinkDataLength£¬µ«¿ÉÄÜÓÐpkt->pktuLinkNextPtrÖ¸ÏòÆäËû·ÖƬ¡£¸ü½øÒ»²½µÄÆäÖÐÁ´±íÉÏ·ÖƬµÄ×ÜÊý¾Ý¾Þϸ¿ÉÄÜ´óÓÚ´æ´¢ÔÚpktuChainDataLength±äÁ¿ÖеľÞϸ¡£ÕâÖÖ²Ù×÷µ¼Öµķ×ÆçÖÂÐÔ½«»áµ¼ÖºóÐø±¨ÎÄ´¦Ö÷¢ÉúÒì³£¡£


ͨ¹ý¼òµ¥µØÉèÖôíÎóµÄIP°ü·ÖƬÊÇÎÞ·¨´¥·¢Â©¶´µÄ£¬ÒòΪ²Ã¼ô¹ýºóµÄ·ÖƬÊý¾ÝÔÚºóÐøµÄtfIpReassemblePacket()º¯Êý²Ù×÷Öлáƾ¾ÝpktuChainDataLengthµÄ¾Þϸ£¬ÖØн¨Á¢·ÖƬÁ´±í£¬²»»áÔì³É·×ÆçÖµÄ״̬¡£ÀíÏëµÄÁ÷³ÌÊÇÏÈÍêÉí·ÖƬÁ´±íµÄ½¨Á¢£¬ÔÙ½øÐÐÁ´±íÊý¾Ý×ܾÞϸµÄ²Ã¼ôÁ÷³Ì£¬ÕâÑù¾Í»á½øÈë·×ÆçÖµÄ״̬¡£


ΪÁËÔÚIP²ã´¦Ö÷ÖƬÊý¾Ý°ü²¢´¥·¢Ö´ÐÐÓÐÎÊÌâµÄÁ÷³Ì´úÂ룬¿ÉÒÔʹÓÃIP-in-IPÊý¾Ý°ü¡£¶ÔÓÚ·ÖƬµÄIP-in-IPÊý¾Ý°ü£¬tfIpIncomingPacket()º¯Êý½«ÖÁÉٵݹéµ÷ÓÃÁ½´Î£¬Ò»´ÎÓÃÓÚIPËíµÀ°üµÄÄÚ²ãIPÊý¾Ý°ü£¬¶à´ÎÓÃÓÚÍâ²ãIPÊý¾Ý°ü£¨Ã¿´¦ÖÃÒ»¸öÍâ²ãIP°ü·ÖƬËã×÷Ò»´Î£©¡£


tfIpIncomingPacket()º¯ÊýÔÚ´¦ÖÃIPËíµÀÊý¾Ý°üµÄʱºò½«ÄÚ²¿IPÊý¾Ý°ü×÷Ϊ·Ç·ÖƬÊý¾Ý°ü½øÐд¦Öá£ÄÚ²¿Êý¾Ý°üÏÖÔÚÓɶà¸ö·ÖƬ×é³É£¬µ«ÔÚIP±¨Í·Öбê־Ϊ·Ç·ÖƬ£¨MF=0£©£¬ËùÒÔËü²»»áÔÙ½øÈëtfIpReassemblePacket()º¯Êý½øÐÐÖØ×é¡£ËüÏÖÔÚÓÉÒ»¸öÁ´±íÖеļ¸¸öµ¥¶ÀµÄtsPacketÁ´½Ó×é³É£¬Ã¿¸öÁ´½Ó¶¼ÓÐÒ»¸öµ¥¶ÀµÄpktuLinkDataLengthÖµ¡£¿¼ÂÇÏÂÃæµÄÀý×Ó£¬Ëü½«ÓÐÖúÓÚÀí½â©¶´µÄ³ÉÒò£º


¡ñ Inner IP packet: IPv4{len=32, proto=17}/UDP{checksum=0, len=12}£¬ÆäÖаüÂÞ1000×Ö½ÚµÄÊý¾Ý¡¯A¡¯¡£

¡ñ Outer IP packet (fragment 1): IPv4{frag offset=0, MF=1, proto=4, id=0xabcd} ,ÆäÖаüÂÞ40×Ö½ÚµÄIPÊý¾Ý¡£

¡ñ Outer IP packet (fragment 2): IPv4{frag offset=40, MF=0, proto=4, id=0xabcd} £¬ÆäÖÐÊý¾Ý¸ººÉΪ988×Ö½Ú¡£


ΪÁËÈƹýUDPУÑ飬½«Ð£ÑéºÍ×Ö¶ÎchecksumÉèÖÃΪ0¡£ÊµÀýÖеķÖƬ½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


µ±TreckЭÒéÕ»´¦ÖÃÍⲿÃÅƬʱ£¬ËüʹÓÃtsUserPacket½á¹¹ÖеÄpktuLinkNextPtr×Ö¶ÎÀ´Á´½ÓËüÃÇ¡£ÈçÇ°ËùÊö£¬µ±tfIpIncomingPacket()º¯Êý´¦ÖÃÄÚ²¿IPÊý¾Ý°ü£¨Ð­ÒéΪ4£¬IP-in-IP£©Ê±£¬ËüÒѾ­Íê³ÉÁË·ÖƬÊý¾ÝµÄÖØ×飨ÄÚ²¿IPÊý¾Ý°üÓÉÁ´½ÓÔÚÒ»ÆðµÄÁ½¸ötsPacket½á¹¹ÌåÏÖ£©¡£·ÖƬÊý¾ÝÖØ×éºóµÄÁ´±í½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÓÉÓÚtfIpIncomingPacket()º¯ÊýÔÚ½øÐÐÓÐЧÐÔÅжÏʱ£¬Ö»¿¼ÂÇtsUserPacketÖеÄpktuChainDataLength×ֶΣ¨¶ø²»ÊÇpktuLinkDataLength£©£¬ËùÒÔÔÚ´¦ÖÃÄÚ²¿IP°üʱ½«½øÈë´íÎóµÄÁ´±í³¤¶ÈµÄ²Ã¼ôÁ÷³Ì£¬´Ó¶øµ¼ÖÂÁËÎÊÌâ¡£


ÄÚ²¿IP°üͨ¹ýÁËIPÍ·ÍêÕûÐÔ¼ì²é£¬ÔÚ¸ÃÀý×ÓÖУ¬ÄÚ²¿IP°üµÄ×ܳ¤¶È(32£©Ð¡ÓÚÁ´±íÊý¾Ý³¤¶È£¨1000+8+20=1028£©£¬Òò´ËTreckЭÒéÕ»½«ÊµÑé´íÎóµØÐÞ¼ôÊý¾Ý°ü£¬ÒªÁìÊǽ«×Ö¶ÎpktuLinkDataLengthºÍpktuChainDataLengthÉèÖÃΪÏàͬµÄÖµipTotalLength£¨ÔÚÎÒÃǵÄʾÀýÖÐΪ32£©¡£Õâµ¼ÖÂÄÚ²¿IPÊý¾Ý°üÓÉÁ´½ÓÔÚÒ»ÆðµÄÁ½¸ötsPacket½á¹¹ÌåÏÖ£¬µ«ËüÃǵÄÊý¾Ý×ܳ¤¶È´óÓÚpktuChainDataLength×ֶΣ¨ÐÞ¼ôºópktuChainDataLength×ֶβ»ÊÇ1028×Ö½Ú£¬¶øÊǼ´ÊÇ32£©¡£¾­¹ýÊý¾Ý³¤¶È²Ã¼ôºóµÄÁ´±í½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÏÖÔÚÒѾ­Ê¹µÃÁ´±íµ½´ïÁË·×ÆçÖµÄ״̬£¬ÏÂÃ潫½éÉÜÈçºÎÀûÓÃÕâÖÖ·×ÆçÖµÄ״̬À´µ¼ÖÂÄÚ´æÆÆ»µ¡£


ÔÚTreckЭÒéÕ»´úÂëÖÐÖÁÉÙÓÐÒ»¸ö´úÂë·¾¶¿ÉÒÔ½«·ÖƬÊý¾Ý¸´ÖƵ½µ¥¸öÁ¬Ðø»º³åÇøÖС£¾ßÌåµÄÖ´Ðз¾¶Îª£º

tfUdpIncomingPacket() ->  tfSocketIncomingPacket() -> tfCopyPacket()¡£ÏÂÃæµÄ´úÂëÊÇtfSocketIncomingPacket()º¯Êý´¦ÖÃUDPÊý¾Ý±¨µÄ´úÂëµÄÒ»²¿ÃÅ£¬ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Õâ¶Î´úÂëÖÐtfSocketIncomingPacket()º¯Êýµ÷ÓÃtfGetSharedBuffer()ÉêÇëÄڴ棬Æä¾Þϸ»ùÓÚpktuChainDataLength×ֶεÄÖµ£¬È»ºóͨ¹ýtfCopyPacket()º¯Êý½«Êý¾Ý°üµÄ²îÒì·ÖƬÖð¸ö¸´ÖƵ½Ð·ÖÅäµÄÄÚ´æ¿Õ¼äÖУ¬·¢ÉúÒç³öµÄ´úÂëÈçÏÂËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÓÉÓÚÁ½¸ö·ÖƬÖеÄpktuLinkDataLengthÖ®ºÍΪ1000×Ö½Ú£¬ºóÐøµÄtfCopyPacketº¯Êý½«»á°Ñ1000×Ö½ÚµÄÊý¾Ý¿½±´µ½Õâ¶ÎÄÚ´æÖУ¬Õ⽫µ¼Ö¶ÑÒç³ö¡£


2¡¢CVE-2020-11898


ÕýÈçÇ°ÎÄÃèÊöÈçºÎ´¥·¢CVE-2020-11896©¶´ÄÇÑù£¬Treck TCP/IPЭÒéÕ»ÎÞ·¨ÕýÈ·´¦ÖÃͨ¹ýIP-in-IPËíµÀ´«ÈëµÄIPv4·ÖƬ¡£ÕâÒ²¿ÉÄÜÔÊÐíδ¾­Éí·ÝÑéÖ¤µÄ¹¥»÷Õß´Ó¶ÑÖÐй©ÄÚ´æ¡£¿ÉÒÔ½ÓÄÉÒÔÏÂʾÀý½øÐЩ¶´´¥·¢£º


¡ñ ÄÚ²¿IPÊý¾Ý°ü£ºIPv4 {ihl = 0xf£¬len = 100£¬proto = 0}£¬ÓÐЧÔغÉΪ'\ x00'* 40 +'\ x41'* 100¡£

¡ñ ÍⲿIPÊý¾Ý°ü£¨·ÖƬ1£©£ºIPv4 {frag offset = 0£¬MF = 1£¬proto = 4£¬id = 0xabcd}£¬ÆäÖÐ24¸ö×Ö½ÚÀ´×ÔÄÚ²¿IPÊý¾Ý°üÓÐЧ¸ºÔØ¡£ÕâÒâζ׎«¸´ÖÆ20¸ö×Ö½ÚµÄIP±êÍ·£¬Íâ¼Ó4¸ö¿Õ×Ö½Ú¡£

¡ñ ÍⲿIPÊý¾Ý°ü£¨·ÖƬ2£©£ºIPv4 {frag offset = 24£¬MF = 0£¬proto = 4£¬id = 0xabcd}£¬À´×ÔÄÚ²¿IPÊý¾Ý°üµÄÆäÓà×Ö½Ú×÷ΪÓÐЧ¸ºÔØ¡£


ʵÀýÖеķÖƬ½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÕâÀïihlΪ0xf£¬ÌåÏÖΪ×î´óIPÑ¡Ï³¤¶ÈΪ60×Ö½Ú£¬Êý¾Ý°ü×ܳ¤¶Ètotal_lengthΪ100¡£µ±ÍøÂçЭÒéÕ»ÊÕµ½Á½¸ö·ÖƬʱ£¬Ëü½«Ê¹ÓÃtfIpReassemblePacket()º¯ÊýÖØÐÂ×é×°ËüÃÇ¡£·ÖƬÊý¾ÝÖØ×éºóµÄÁ´±í½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


¸ÃtfIpReassemblePacket()º¯ÊýʹÓÃtsUserPacket½á¹¹ÖеÄ×Ö¶ÎpktuLinkNextPtrÁ´½ÓÁ½¸ö·ÖƬ¡£Èç¹ûÆôÓÃÁËIP-in-IPËíµÀ´«Ê䣬ÔòÄÚ²¿IPÊý¾Ý°ü½«ËæºóÓÉtfIpIncomingPacket()º¯ÊýÖд¦Öã¬ÐÞ¼ôºóµÄpktuChainDataLength×ֶβ»ÊÇ160£¬¶øÊǼ´ÊÇ100¡£¾­¹ýÊý¾Ý³¤¶È²Ã¼ôºóµÄÁ´±í½á¹¹ÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÄÚ²¿IPÊý¾Ý°üͨ¹ýIP±êÍ·ÍêÕûÐÔ¼ì²é£¬ÒòΪ½ö¿¼ÂÇÁËtsUserPacketµÄpktuChainDataLength×ֶΣ¨¶ø²»¿¼ÂÇpktuLinkDataLength£©¡£ÒòΪÔڳ߶ÈIPÍ·²¿£¨20¸ö×Ö½Ú£©Ö®ºóÓÐ4¸ö¿Õ×Ö½Ú£¬¶øÇÒÒ»¸ö¿Õ×Ö½Ú´ú±íIPÑ¡ÏîµÄĩ⣬IPÑ¡Ïî½âÎöͨ¹ý¼ì²é¡£ÓÉÓÚÄÚ²¿IPÊý¾Ý°ü°üÂÞÎÞЧµÄIPv4ЭÒé±àºÅ£¨ProtocolΪ0£©£¬½øÈëdefault·ÖÖ§£¬È»ºóÖ±½Ó½øÈëTM_IP_LOCAL_FLAG·ÖÖ§¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Òò´ËÍøÂçЭÒéÕ»½«Í¨¹ý·¢ËÍÀàÐÍΪ3£¨Ä¿±ê²»ÐдºÍ´úÂëΪ2£¨Ð­Òé²»ÐдµÄICMP´íÎóÏûÏ¢À´¾Ü¾ø¸ÃÊý¾Ý°ü¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÂôÁ¦´´½¨´íÎóÊý¾Ý°üµÄÊÇtfIcmpErrPacket()º¯Êý¡£Ëü·ÖÅäÒ»¸öеÄÊý¾Ý°ü£¬³õʼ»¯Ò»Ð©ICMPÍ·²¿×ֶΡ£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


×îºó´ÓºóÐøÊý¾Ý°ü£¨ÄÚ²¿IPÊý¾Ý°ü£©Öи´ÖÆһЩÊý¾Ý¡£¸´ÖƲ¿ÃÅÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Èç´úÂëËù¼û£¬tfIcmpErrPacket()º¯Êýͨ¹ý»ñÈ¡IP±¨Í·³¤¶È£¨ÒÔ×Ö½ÚΪµ¥Ôª¼ÓÉÏ8£¬ÔÚʵ¼ÊÇé¿öÏÂΪ60 + 8 = 68£©ÓëpktuLinkDataLength×ֶΣ¨ÒÔ¼°±»²Ã¼ôΪ100£©Ö®¼äµÄ×îСֵÀ´¼ÆËãÒª¸´ÖƵÄ×Ö½ÚÊý ¡£ÓÉÓÚ·¢ËÍÊý¾Ý°üµÄµÚÒ»¸ö·ÖƬµÄʵ¼ÊÁ´Â·Êý¾Ý³¤¶ÈΪ24£¨¶ø²»ÊÇ100£©£¬Òò´ËtfIcmpErrPacket()º¯Êý½«´Ó¶ÑÖи´ÖÆ68-24 = 44×Ö½ÚµÄÌرðÊý¾Ý¡£È»ºóÉèÖÃv12_icmpErrPacketÖÐÏà¹ØÊý¾Ý¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


×îºóµ÷ÓÃtfIpSendPacket()º¯Êý·¢ËÍicmp_ErrPacket°üµ½Ä¿±êµØÖ·£¬Õ⽫µ¼ÖÂ44×Ö½ÚµÄÐÅϢй¶¡£


3¡¢CVE-2020-11910


CVE-2020-11910ÊÇÔ½½ç¶Á©¶´£¬¸Ã©¶´´æÔÚtfIcmpIncomingPacketº¯ÊýÖУ¬¸Ãº¯ÊýÖ÷ÒªÊÇ´¦ÖÃICMP°ü¡£tfIcmpIncomingPacketº¯ÊýÔÚ´¦ÖÃÉ豸ÊÕµ½ÀàÐÍΪ3£¬codeΪ4µÄICMP°üµÄʱºò£¬´úÂ벢ûÓÐÑéÖ¤ºóÐøÊý¾ÝµÄ³¤¶È£¬Ö±½Ó¾Í·ÃÎÊÁ˶ÔӦλÖõÄÊý¾Ý£¬Ôì³ÉÁËÔ½½ç¶Á©¶´¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


4¡¢CVE-2020-11911


CVE-2020-11911ÊÇδÊÚȨµÄÃô¸ÐÐÅÏ¢¸üЩ¶´£¬¸Ã©¶´´æÔÚtfIcmpIncomingPacketº¯ÊýÖУ¬¸Ãº¯ÊýÖ÷ÒªÊÇ´¦ÖÃICMP°ü¡£tfIcmpIncomingPacketº¯ÊýÔÚ´¦ÖÃÉ豸ÊÕµ½ÀàÐÍΪ18£¨Address mask reply£©°üµÄʱºò£¬´úÂ벢ûÓÐÑéÖ¤É豸ÊÇ·ñ·¢Ë͹ýÀàÐÍ17£¨Address mask request£©ÇëÇ󣬾ÍÖ±½Ó¸üÐÂÁËÉ豸µÄ×ÓÍøÑÚÂë¡£ÈçÏ´úÂëËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Æß¡¢CVE-2020-11898©¶´ÑéÖ¤


Ô¶³Ì¹¥»÷´òÓ¡»ú£¬ÊÓƵÇ뵽΢ÐŹ«ÖÚºÅÖмì²ì£ºÑéÖ¤ÊÓƵ¡£


°Ë¡¢²Î¿¼


1¡¢https://www.ietf.org/rfc/rfc2003.txt

2¡¢https://www.ietf.org/rfc/rfc792.txt

3¡¢https://www.ietf.org/rfc/rfc1853.txt

4¡¢https://www.jsof-tech.com/ripple20/

5¡¢https://kb.cert.org/vuls/id/257161

6¡¢/article/1/11834.html

7¡¢JSOF_Ripple20_Technical_Whitepaper_June20.pdf



¶«É­Æ½Ì¨»ý¼«·ÀÓùʵÑéÊÒ£¨ADLab£©


ADLab½¨Á¢ÓÚ1999Ä꣬ÊÇÖйúÄþ¾²ÐÐÒµ×îÔ罨Á¢µÄ¹¥·À¼¼ÊõÑо¿ÊµÑéÊÒÖ®Ò»£¬Î¢ÈíMAPP¼Æ»®ºËÐijÉÔ±£¬¡°ºÚȸ¹¥»÷¡±¿´·¨Ê×ÍÆÕß¡£½ØֹĿǰ£¬ADLabÒÑͨ¹ýCVEÀÛ¼ÆÐû²¼Äþ¾²Â©¶´1000Óà¸ö£¬Í¨¹ý CNVD/CNNVDÀÛ¼ÆÐû²¼Äþ¾²Â©¶´800Óà¸ö£¬Á¬Ðø±£³Ö¹ú¼ÊÍøÂçÄþ¾²ÁìÓòÒ»Á÷Ë®×¼¡£ÊµÑéÊÒÑо¿Æ«Ïòº­¸Ç²Ù×÷ϵͳÓëÓ¦ÓÃϵͳÄþ¾²Ñо¿¡¢Òƶ¯ÖÇÄÜÖÕ¶ËÄþ¾²Ñо¿¡¢ÎïÁªÍøÖÇÄÜÉ豸Äþ¾²Ñо¿¡¢WebÄþ¾²Ñо¿¡¢¹¤¿ØϵͳÄþ¾²Ñо¿¡¢ÔÆÄþ¾²Ñо¿¡£Ñо¿½á¹ûÓ¦ÓÃÓÚ²úÎïºËÐļ¼ÊõÑо¿¡¢¹ú¼ÒÖصã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨ÒµÄþ¾²·þÎñµÈ¡£



¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾