~ubuntu-branches/ubuntu/maverick/strongswan/maverick

« back to all changes in this revision

Viewing changes to src/charon/plugins/kernel_pfkey/kernel_pfkey_ipsec.c

  • Committer: Bazaar Package Importer
  • Author(s): Rene Mayrhofer
  • Date: 2009-04-01 22:17:52 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20090401221752-eozrk0ctabblo94z
* New upstream release, which incorporates the fix. Removed dpatch for it.
  Closes: #521950: CVE-2009-0790: DoS
* New support for EAP RADIUS authentication, enabled for this package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
14
 * for more details.
15
15
 *
16
 
 * $Id: kernel_pfkey_ipsec.c 4662 2008-11-16 21:19:58Z andreas $
 
16
 * $Id: kernel_pfkey_ipsec.c 4793 2008-12-11 13:39:30Z tobias $
17
17
 */
18
18
 
19
19
#include <sys/types.h>
43
43
#define IP_IPSEC_POLICY 16
44
44
#endif
45
45
 
 
46
/* missing on uclibc */
 
47
#ifndef IPV6_IPSEC_POLICY
 
48
#define IPV6_IPSEC_POLICY 34
 
49
#endif /*IPV6_IPSEC_POLICY*/
 
50
 
46
51
/** default priority of installed policies */
47
52
#define PRIO_LOW 3000
48
53
#define PRIO_HIGH 2000
533
538
}
534
539
 
535
540
/**
 
541
 * add a host to the given sadb_msg
 
542
 */
 
543
static void add_addr_ext(struct sadb_msg *msg, host_t *host, u_int16_t type,
 
544
                                                 u_int8_t proto, u_int8_t prefixlen)
 
545
{
 
546
        struct sadb_address *addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
 
547
        addr->sadb_address_exttype = type;
 
548
        addr->sadb_address_proto = proto;
 
549
        addr->sadb_address_prefixlen = prefixlen;
 
550
        host2ext(host, addr);
 
551
        PFKEY_EXT_ADD(msg, addr);
 
552
}
 
553
 
 
554
/**
 
555
 * adds an empty address extension to the given sadb_msg
 
556
 */
 
557
static void add_anyaddr_ext(struct sadb_msg *msg, int family, u_int8_t type)
 
558
{
 
559
        socklen_t len = (family == AF_INET) ? sizeof(struct sockaddr_in) :
 
560
                                                                                  sizeof(struct sockaddr_in6);
 
561
        struct sadb_address *addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
 
562
        addr->sadb_address_exttype = type;
 
563
        sockaddr_t *saddr = (sockaddr_t*)(addr + 1);
 
564
        saddr->sa_family = family;
 
565
        addr->sadb_address_len = PFKEY_LEN(sizeof(*addr) + len);
 
566
        PFKEY_EXT_ADD(msg, addr);
 
567
}
 
568
 
 
569
/**
536
570
 * add udp encap extensions to a sadb_msg
537
571
 */
538
572
static void add_encap_ext(struct sadb_msg *msg, host_t *src, host_t *dst)
573
607
        host = host_create_from_sockaddr((sockaddr_t*)&address[1])      ;
574
608
        ts = traffic_selector_create_from_subnet(host, address->sadb_address_prefixlen,
575
609
                                address->sadb_address_proto, host->get_port(host));
576
 
        host->destroy(host);
577
610
        return ts;
578
611
}
579
612
 
1026
1059
        unsigned char request[PFKEY_BUFFER_SIZE];
1027
1060
        struct sadb_msg *msg, *out;
1028
1061
        struct sadb_x_sa2 *sa2;
1029
 
        struct sadb_address *addr;
1030
1062
        struct sadb_spirange *range;
1031
1063
        pfkey_msg_t response;
1032
1064
        u_int32_t received_spi = 0;
1046
1078
        sa2->sadb_x_sa2_reqid = reqid;
1047
1079
        PFKEY_EXT_ADD(msg, sa2);
1048
1080
        
1049
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1050
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1051
 
        host2ext(src, addr);
1052
 
        PFKEY_EXT_ADD(msg, addr);
1053
 
        
1054
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1055
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1056
 
        host2ext(dst, addr);
1057
 
        PFKEY_EXT_ADD(msg, addr);
 
1081
        add_addr_ext(msg, src, SADB_EXT_ADDRESS_SRC, 0, 0);
 
1082
        add_addr_ext(msg, dst, SADB_EXT_ADDRESS_DST, 0, 0);
1058
1083
        
1059
1084
        range = (struct sadb_spirange*)PFKEY_EXT_ADD_NEXT(msg);
1060
1085
        range->sadb_spirange_exttype = SADB_EXT_SPIRANGE;
1112
1137
        struct sadb_msg *msg, *out;
1113
1138
        struct sadb_sa *sa;
1114
1139
        struct sadb_x_sa2 *sa2;
1115
 
        struct sadb_address *addr;
1116
1140
        struct sadb_lifetime *lft;
1117
1141
        struct sadb_key *key;
1118
1142
        size_t len;
1143
1167
        sa2->sadb_x_sa2_reqid = reqid;
1144
1168
        PFKEY_EXT_ADD(msg, sa2);
1145
1169
        
1146
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1147
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1148
 
        host2ext(src, addr);
1149
 
        PFKEY_EXT_ADD(msg, addr);
1150
 
        
1151
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1152
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1153
 
        host2ext(dst, addr);
1154
 
        PFKEY_EXT_ADD(msg, addr);
 
1170
        add_addr_ext(msg, src, SADB_EXT_ADDRESS_SRC, 0, 0);
 
1171
        add_addr_ext(msg, dst, SADB_EXT_ADDRESS_DST, 0, 0);
1155
1172
        
1156
1173
        lft = (struct sadb_lifetime*)PFKEY_EXT_ADD_NEXT(msg);
1157
1174
        lft->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
1244
1261
        unsigned char request[PFKEY_BUFFER_SIZE];
1245
1262
        struct sadb_msg *msg, *out;
1246
1263
        struct sadb_sa *sa;
1247
 
        struct sadb_address *addr;
1248
1264
        pfkey_msg_t response;
1249
1265
        size_t len;
1250
1266
        
1276
1292
        PFKEY_EXT_ADD(msg, sa);
1277
1293
        
1278
1294
        /* the kernel wants a SADB_EXT_ADDRESS_SRC to be present even though
1279
 
         * it is not used for anything, so we just send dst twice */
1280
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1281
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1282
 
        host2ext(dst, addr);
1283
 
        PFKEY_EXT_ADD(msg, addr);
1284
 
        
1285
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1286
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1287
 
        host2ext(dst, addr);
1288
 
        PFKEY_EXT_ADD(msg, addr);
 
1295
         * it is not used for anything. */
 
1296
        add_anyaddr_ext(msg, dst->get_family(dst), SADB_EXT_ADDRESS_SRC);
 
1297
        add_addr_ext(msg, dst, SADB_EXT_ADDRESS_DST, 0, 0);
1289
1298
        
1290
1299
        if (pfkey_send(this, msg, &out, &len) != SUCCESS)
1291
1300
        {
1371
1380
        unsigned char request[PFKEY_BUFFER_SIZE];
1372
1381
        struct sadb_msg *msg, *out;
1373
1382
        struct sadb_sa *sa;
1374
 
        struct sadb_address *addr;
1375
1383
        size_t len;
1376
1384
        
1377
1385
        memset(&request, 0, sizeof(request));
1391
1399
        PFKEY_EXT_ADD(msg, sa);
1392
1400
        
1393
1401
        /* the kernel wants a SADB_EXT_ADDRESS_SRC to be present even though
1394
 
         * it is not used for anything, so we just send dst twice */
1395
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1396
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1397
 
        host2ext(dst, addr);
1398
 
        PFKEY_EXT_ADD(msg, addr);
1399
 
        
1400
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1401
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1402
 
        host2ext(dst, addr);
1403
 
        PFKEY_EXT_ADD(msg, addr);
 
1402
         * it is not used for anything. */
 
1403
        add_anyaddr_ext(msg, dst->get_family(dst), SADB_EXT_ADDRESS_SRC);
 
1404
        add_addr_ext(msg, dst, SADB_EXT_ADDRESS_DST, 0, 0);
1404
1405
        
1405
1406
        if (pfkey_send(this, msg, &out, &len) != SUCCESS)
1406
1407
        {
1435
1436
        unsigned char request[PFKEY_BUFFER_SIZE];
1436
1437
        struct sadb_msg *msg, *out;
1437
1438
        struct sadb_x_policy *pol;
1438
 
        struct sadb_address *addr;
1439
1439
        struct sadb_x_ipsecrequest *req;
1440
1440
        policy_entry_t *policy, *found = NULL;
1441
1441
        pfkey_msg_t response;
1510
1510
        pol->sadb_x_policy_len += PFKEY_LEN(req->sadb_x_ipsecrequest_len);
1511
1511
        PFKEY_EXT_ADD(msg, pol);
1512
1512
        
1513
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1514
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1515
 
        addr->sadb_address_proto = policy->src.proto;
1516
 
        addr->sadb_address_prefixlen = policy->src.mask;
1517
 
        host2ext(policy->src.net, addr);
1518
 
        PFKEY_EXT_ADD(msg, addr);
1519
 
        
1520
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1521
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1522
 
        addr->sadb_address_proto = policy->dst.proto;
1523
 
        addr->sadb_address_prefixlen = policy->dst.mask;
1524
 
        host2ext(policy->dst.net, addr);
1525
 
        PFKEY_EXT_ADD(msg, addr);
 
1513
        add_addr_ext(msg, policy->src.net, SADB_EXT_ADDRESS_SRC, policy->src.proto,
 
1514
                                 policy->src.mask);
 
1515
        add_addr_ext(msg, policy->dst.net, SADB_EXT_ADDRESS_DST, policy->dst.proto,
 
1516
                                 policy->dst.mask);
1526
1517
        
1527
1518
        this->mutex->unlock(this->mutex);
1528
1519
        
1626
1617
        unsigned char request[PFKEY_BUFFER_SIZE];
1627
1618
        struct sadb_msg *msg, *out;
1628
1619
        struct sadb_x_policy *pol;
1629
 
        struct sadb_address *addr;
1630
1620
        policy_entry_t *policy, *found = NULL;
1631
1621
        pfkey_msg_t response;
1632
1622
        size_t len;
1667
1657
        pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
1668
1658
        PFKEY_EXT_ADD(msg, pol);
1669
1659
        
1670
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1671
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1672
 
        addr->sadb_address_proto = policy->src.proto;
1673
 
        addr->sadb_address_prefixlen = policy->src.mask;
1674
 
        host2ext(policy->src.net, addr);
1675
 
        PFKEY_EXT_ADD(msg, addr);
1676
 
        
1677
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1678
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1679
 
        addr->sadb_address_proto = policy->dst.proto;
1680
 
        addr->sadb_address_prefixlen = policy->dst.mask;
1681
 
        host2ext(policy->dst.net, addr);
1682
 
        PFKEY_EXT_ADD(msg, addr);
 
1660
        add_addr_ext(msg, policy->src.net, SADB_EXT_ADDRESS_SRC, policy->src.proto,
 
1661
                                 policy->src.mask);
 
1662
        add_addr_ext(msg, policy->dst.net, SADB_EXT_ADDRESS_DST, policy->dst.proto,
 
1663
                                 policy->dst.mask);
1683
1664
        
1684
1665
        this->mutex->unlock(this->mutex);
1685
1666
        
1723
1704
        unsigned char request[PFKEY_BUFFER_SIZE];
1724
1705
        struct sadb_msg *msg, *out;
1725
1706
        struct sadb_x_policy *pol;
1726
 
        struct sadb_address *addr;
1727
1707
        policy_entry_t *policy, *found = NULL;
1728
1708
        route_entry_t *route;
1729
1709
        size_t len;
1777
1757
        pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
1778
1758
        PFKEY_EXT_ADD(msg, pol);
1779
1759
        
1780
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1781
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1782
 
        addr->sadb_address_proto = policy->src.proto;
1783
 
        addr->sadb_address_prefixlen = policy->src.mask;
1784
 
        host2ext(policy->src.net, addr);
1785
 
        PFKEY_EXT_ADD(msg, addr);
1786
 
        
1787
 
        addr = (struct sadb_address*)PFKEY_EXT_ADD_NEXT(msg);
1788
 
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1789
 
        addr->sadb_address_proto = policy->dst.proto;
1790
 
        addr->sadb_address_prefixlen = policy->dst.mask;
1791
 
        host2ext(policy->dst.net, addr);
1792
 
        PFKEY_EXT_ADD(msg, addr);
 
1760
        add_addr_ext(msg, policy->src.net, SADB_EXT_ADDRESS_SRC, policy->src.proto,
 
1761
                                 policy->src.mask);
 
1762
        add_addr_ext(msg, policy->dst.net, SADB_EXT_ADDRESS_DST, policy->dst.proto,
 
1763
                                 policy->dst.mask);
1793
1764
        
1794
1765
        route = policy->route;
1795
1766
        policy->route = NULL;