Безопасности простой клиент/сервер приложение


Я пишу приложение, направленных на рабочем столе, но с использованием веб-технологий. Он будет иметь интерфейс HTML и сервер, написанный на Python, используя колбу сделаем все взаимодействия файловой системы. Он будет иметь возможность редактировать настройки пользователя, поэтому я хочу, чтобы сделать невозможным для других пользователей, чтобы вмешиваться. Это немного сложнее, поскольку сервер и клиент общаются по протоколу HTTP через порт на localhost.

Программа разделена между 3 файлов:

run.py - контролирует запуск и выключение сервера и клиента.

import os
import json
import time
import signal

secret_file = os.path.join(os.environ['HOME'], '.myapp.secret')
if os.path.exists(secret_file):
    os.remove(secret_file)

os.system("python server.py &")

while not os.path.exists(secret_file):
    time.sleep(0.1)

f = open(secret_file)
secret = json.load(f)

url = 'http://localhost:' + str(secret['port']) + '/' + secret['key']

os.system("python client.py " + url)


os.kill(secret['pid'], signal.SIGINT)

server.py

from flask import Flask, request, Response
import socket
import random
import json
import sys
import os

app = Flask(__name__)
key = ''.join(random.sample(
    "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM", 
    random.randint(8, 24)
))
port = 0
secret_file = os.path.join(os.environ['HOME'], '.myapp.secret')

@app.route('/<authkey>')
def hello(authkey):
    if authkey == key:
        return 'Hello, world!'
    else:
        return Response('Access Denied', 401)

def broadcast(port):
    s = json.dumps({
        'key' : key,
        'port' : port,
    'pid' : os.getpid()
    })
    f = open(
        secret_file,
        'w'
    )
    f.write(s)
    os.chmod(secret_file, 0400)
    f.close()


if __name__ == '__main__':
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost', 0))
    port = sock.getsockname()[1]
    broadcast(port)
    sock.close()
    app.run(port=port)

client.py

Это простое окно ГТК с виджетом на базе WebKit, который отображает страницу. Это делает URL-адреса, переданного ему по первому аргументу.

Это достаточно безопасно? Также есть любые другие проблемы, которые я не рассмотрел?



2284
5
задан 25 февраля 2011 в 08:02 Источник Поделиться
Комментарии
2 ответа

Главное, что необходимо применить в том, что только тот же локальный пользователь может ознакомиться с Здравствуй, мир.

Вы надеетесь, как минимум, о неспособности любой случайный пользователь


  1. слушать чужие гнезда.

  2. читать файлы другого пользователя

  3. в противном случае узнать тайну

  4. выполнить произвольный код на Python в вашем сервере

  5. И неспособность к удаленному злоумышленнику подключиться к вашей розетке.

1, 2 и 4 зависит от того, насколько хорошо вы обеспечили вашу систему (без повышения прав или случайные файлы с битом SUID валяются). 4 также зависит безопасность колбу и остаток стека на Python.

Пять может быть нарушен, в зависимости от того, как ваш брандмауэр настроен (кто-то может использовать отслеживание подключений для получения вашего гнезда передаются, хотя она привязана к localhost). Вы бы лучше через сокеты домена Unix.

Второй сломан, потому что вы chmod файл только после того как вы написали его. Это дает возможность злоумышленнику открыть файл. Фактически злоумышленник может даже записать в файл и выполнить произвольные команды, который является, почему вы никогда не должны использовать ОС.системы, и вы должны использовать urlparse для построения URL-адреса.

Третий сломан в двух направлениях:


  • секрет появляется в списке процессов

  • сервер не примет то же время для сравнения строк, которые в основном правильно и в основном неправильно. Злоумышленник может угадать длину секрета, и думаю, секретное письмо письмо (времени атаки).

4
ответ дан 26 февраля 2011 в 11:02 Источник Поделиться

Это не безопасно, потому что вы удаляете файл с Порту. Найти открытые порты легко. Лучшим вариантом является привязка только на localhost, так что вы не можете подключиться с других компьютеров на всех. Выяснить, порт всегда будет легко, так что этот секрет не поможет. На самом деле это должен быть настраиваемый, так что вы можете избежать конфликтов.

Так вы запустите сервер с помощью клиента, вы можете создать ключ в клиент, и вместо того, чтобы передать его на сервер при запуске желательно через stdin. Таким образом, он не должен существовать в файловой системе вообще. Вы, вероятно, хотите использовать подпроцесс вместо ОС.система для этого.

3
ответ дан 26 февраля 2011 в 11:02 Источник Поделиться