~phablet-team/content-hub/trunk

« back to all changes in this revision

Viewing changes to src/com/ubuntu/content/utils.cpp

  • Committer: CI Train Bot
  • Author(s): Ken VanDine
  • Date: 2015-06-03 17:45:33 UTC
  • mfrom: (210.1.13 lp1456628)
  • Revision ID: ci-train-bot@canonical.com-20150603174533-pa6a6nnfpp4n18z8
* SECURITY UPDATE: file disclosure via unchecked AppArmor profile
    (LP: #1456628)
  - Don't allow exporting of files that aren't allowed by the source apparmor profile
  - CVE-2015-1327 Fixes: #1456628
Approved by: Michael Sheldon

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 * Authored by: Ken VanDine <ken.vandine@canonical.com>
17
17
 */
18
18
 
 
19
#include <QCoreApplication>
 
20
#include <QDir>
 
21
#include <QFile>
 
22
#include <QFileInfo>
 
23
#include <QProcess>
19
24
#include <QtCore>
20
25
#include <QtDBus/QDBusMessage>
21
26
#include <QtDBus/QDBusConnection>
22
 
#include <QFile>
23
 
#include <QDir>
24
 
#include <QFileInfo>
25
27
#include <QUrl>
26
28
#include <nih/alloc.h>
27
29
#include <nih-dbus/dbus_util.h>
31
33
#include "com/ubuntu/content/type.h"
32
34
#include <unistd.h>
33
35
 
 
36
#include <sys/apparmor.h>
 
37
/* need to be exposed in libapparmor but for now ... */
 
38
#define AA_CLASS_FILE 2
 
39
#define AA_MAY_READ (1 << 2)
 
40
 
34
41
namespace cuc = com::ubuntu::content;
35
42
 
36
43
namespace {
102
109
            reply.errorMessage();
103
110
    }
104
111
 
105
 
    if (aaProfile.toStdString() == QString("unconfined").toStdString())
106
 
    {
107
 
        return QString("");
108
 
    }
109
112
    return aaProfile;
110
113
}
111
114
 
175
178
    return false;
176
179
}
177
180
 
 
181
int query_file(const char *label, const char *path, int *allowed)
 
182
{
 
183
    int rc, audited;
 
184
    char *query;
 
185
 
 
186
    /* + 1 for null separator and then + 1 AA_CLASS_FILE */
 
187
    int label_size = strlen(label);
 
188
    int size = label_size + 1 + strlen(path) + AA_QUERY_CMD_LABEL_SIZE + 1;
 
189
    /* +1 for null terminator used by strcpy, yes we could drop this
 
190
     * using memcpy */
 
191
    query = (char*)malloc(size + 1);
 
192
    if (!query)
 
193
        return -1;
 
194
    /* we want the null terminator here */
 
195
    strcpy(query + AA_QUERY_CMD_LABEL_SIZE, label);
 
196
    query[AA_QUERY_CMD_LABEL_SIZE + label_size + 1] = AA_CLASS_FILE;
 
197
    strcpy(query + AA_QUERY_CMD_LABEL_SIZE + label_size + 2, path);
 
198
    rc = aa_query_label(AA_MAY_READ, query, size , allowed, &audited);
 
199
    free(query);
 
200
    return rc;
 
201
}
 
202
 
 
203
bool check_profile_read(QString profile, QString path)
 
204
{
 
205
    TRACE() << Q_FUNC_INFO << "PROFILE:" << profile;
 
206
 
 
207
    int allowed;
 
208
    if (query_file(profile.toStdString().c_str(), path.toStdString().c_str(), &allowed) == -1) {
 
209
        qWarning() << "error:" << strerror(errno) << path;
 
210
        return false;
 
211
    }
 
212
   
 
213
    if (allowed) {
 
214
        TRACE() << "ALLOWED:" << QString::number(allowed);
 
215
        return true;
 
216
    }
 
217
    TRACE() << "NOT ALLOWED:" << QString::number(allowed);
 
218
    return false;
 
219
 
 
220
}
 
221
 
178
222
}